样例都过不了,貌似Splay旋出问题了,求助qwq
#include<bits/stdc++.h>
#define D for(int i=1;i<=Splay::cnt;i++)cout<<i<<" "<<Splay::val[i]<<" "<<Splay::ch[i][0]<<" "<<Splay::ch[i][1]<<" "<<Splay::fa[i]<<" "<<Splay::siz[i]<<" "<<Splay::tag[i]<<"\n"
using namespace std;
const int N=1e6+7;
namespace Splay{
int ch[N][2],tag[N],siz[N],rt,val[N],cnt,fa[N];
inline bool get(int x){
return x==ch[fa[x]][1];
}
inline void update(int x){
siz[0]=0;
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
}
inline void push_down(int x){
if(tag[x]){
swap(ch[x][0],ch[x][1]);
tag[x]=0;
tag[ch[x][0]]^=1;
tag[ch[x][1]]^=1;
}
}
inline void rotate(int x){
int y=fa[x],z=fa[y];
int opt=get(x);
push_down(z),push_down(y),push_down(x);
if(z) ch[z][get(y)]=x;
ch[y][opt]=ch[x][opt^1];
if(ch[x][opt^1]) fa[ch[x][opt^1]]=y;
ch[x][opt^1]=y;
fa[x]=z,fa[y]=x;
update(y),update(x),update(z);
}
inline void Splay(int x,int t){
for(int f=fa[x];f=fa[x],f!=t;rotate(x))
if(fa[f]!=t) rotate(get(x)==get(f)?f:x);
if(t==0) rt=x;
}
inline void insert(int x){
if(!rt){
rt=++cnt;
val[cnt]=x;
update(x);
return;
}
int cur=rt,f=0;
while(1){
f=cur;
cur=ch[cur][x>val[cur]];
if(!cur){
val[++cnt]=x;
fa[cnt]=f;
ch[f][x>val[f]]=cnt;
update(cnt),update(f);
Splay(cnt,0);
return;
}
}
}
inline int nxt(){
push_down(rt);
int cur=ch[rt][1];
while(1){
push_down(cur);
if(!ch[cur][0]) break;
cur=ch[cur][0];
}
return cur;
}
inline void reserve(int l,int r){
Splay(l,0),Splay(r,l);
tag[ch[r][0]]^=1;
}
}
int n;
pair<int,int> a[N];
int b[N];
inline bool cmp(pair<int,int> x,pair<int,int> y){
if(x.first==y.first) return x.second<y.second;
return x.first<y.first;
}
int main(){
//ios::sync_with_stdio(false);
//cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].first;
a[i].second=i;
}
sort(a+1,a+n+1,cmp);
b[0]=1,b[n+1]=2;
for(int i=1;i<=n;i++){
b[i]=a[i].second+2;
}
Splay::insert(0);
Splay::insert(n+1);
for(int i=1;i<=n;i++){
Splay::insert(i);
}
for(int i=1;i<=n;i++){
int p=b[i];
Splay::Splay(p,0);
cout<<Splay::siz[Splay::ch[p][0]]<<" ";
//cout<<"\n";D;
p=Splay::nxt();
int q=b[i-1];
//cout<<i<<" "<<q<<" "<<p<<"\n";
Splay::reserve(q,p);
}
return 0;
}