rt,应该是死循环。
代码可能有点傻逼:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int rt=0,tot=0;
int cnt[N]={0},son[N][2]={0},val[N]={0},size[N]={0},f[N]={0};
struct Splay{
inline void New(int x,int f){
val[++tot]=x;
cnt[tot]=size[tot]=1;
::f[tot]=f;
son[f][val[f]<x]=tot;
return ;
}
inline void update(int x){
size[x]=size[son[x][0]]+size[son[x][1]]+cnt[x];
return ;
}
inline int get(int x){
return x==son[f[x]][1];
}
inline void clear(int x){
son[x][0]=son[x][1]=f[x]=val[x]=size[x]=cnt[x]=0;
}
inline void rotate(int x){
int y=f[x],z=f[y],s=get(x);
son[y][s]=son[x][s^1];
if(son[x][s^1])f[son[x][s^1]]=y;
son[x][s^1]=y;
f[y]=x;f[x]=z;
if(z)son[z][y==son[z][1]]=x;
update(x),update(y);
}
inline void splay(int x){
for(int fa=f[x];fa=f[x],fa;rotate(x))
if(f[fa])rotate(get(x)==get(fa)?fa:x);
rt=x;
}
inline void insert(int x){
if(!rt){
New(x,0);
rt=tot;
return;
}
int p=rt,f=0;
while(1){
if(val[p]==x){
cnt[p]++;
update(f),update(p);
splay(p);
return ;
}
f=p;
p=son[p][val[p]<x];
if(!p){
New(x,f);
update(tot),update(f);
splay(tot);
return ;
}
}
}
inline int getrk(int x){
int res=0,p=rt;
while(1){
if(x<val[p]){
p=son[p][0];
}else{
res+=size[son[p][0]];
if(x==val[p]){
splay(p);
return res+1;
}
res+=cnt[p];
p=son[p][1];
}
}
}
inline int getval(int x){
int p=rt;
while(1){
if(son[p][0]&&x<=size[son[p][0]]){
p=son[p][0];
}else{
x-=cnt[p]+size[son[p][0]];
if(x<=0){
splay(p);
return val[p];
}
p=son[p][1];
}
}
}
inline int getpre_(){
int p=son[rt][0];
if(!p)return p;
while(son[p][1])p=son[p][1];
splay(p);
return p;
}
inline int getnxt_(){
int p=son[rt][1];
if(!p)return p;
while(son[p][0])p=son[p][0];
splay(p);
return p;
}
inline void dele(int x){
getrk(x);
if(cnt[rt]>1){
cnt[rt]--;
update(rt);
return;
}
if(!son[rt][0]&&!son[rt][1]){
clear(rt);
rt=0;
return;
}
if(!son[rt][0]){
int p=rt;
rt=son[rt][1];
f[rt]=0;
clear(p);
return;
}
if(!son[rt][1]){
int p=rt;
rt=son[rt][0];
f[rt]=0;
clear(p);
return;
}
int p=rt;
int k=getpre_();
f[son[p][1]]=k;
son[k][1]=son[p][1];
clear(p);
update(rt);
}
inline int getnxt(int x){
insert(x);
int k=getnxt_();
dele(x);
return val[k];
}
inline int getpre(int x){
insert(x);
int k=getpre_();
dele(x);
return val[k];
}
}a;
int main(){
int n;
cin>>n;
while(n--){
int opt,x;
cin>>opt>>x;
if(opt==1)a.insert(x);
if(opt==2)a.dele(x);
if(opt==3)cout<<a.getrk(x)<<endl;
if(opt==4)cout<<a.getval(x)<<endl;
if(opt==5)cout<<a.getpre(x)<<endl;
if(opt==6)cout<<a.getnxt(x)<<endl;
}
return 0;
}