#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,cnt=0,root=0;
struct {
int fa,ls,rs;
int val,rnd,siz;
}t[N];
int new_p(int a){
t[++cnt].siz=1;
t[cnt].rnd=rand();
t[cnt].val=a;
return cnt;
}
void update(int x){
t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+1;
}
void split(int now,int k,int &x,int &y){
if(!now) x=y=0;
else {
if(t[now].val<=k){
x=now;
split(t[now].rs,k,t[now].rs,y);
} else {
y=now;
split(t[now].ls,k,x,t[now].ls);
}
update(now);
}
}
int Merge(int x,int y){
if(!x || !y) return x+y;
if(t[x].rnd<t[y].rnd){
t[x].rs=Merge(t[x].rs,y);
update(x);
return x;
} else {
t[y].ls=Merge(x,t[y].ls);
update(y);
return y;
}
}
int x,y,z;
void insert(int ver){
split(root,ver,x,y);
root=Merge(Merge(x,new_p(ver)),y);
}
void Delete(int a){
split(root,a,x,z);
split(root,a-1,x,y);
y=Merge(t[y].ls,t[y].rs);
root=Merge(Merge(x,y),z);
}
void get_rand(int ver){
split(root,ver-1,x,y);
printf("%d\n",t[x].siz+1);
root=Merge(x,y);
}
void kth(int k){
int now=root;
while(1){
if(t[t[now].ls].siz>=k) now=t[now].ls;
else if(k==t[t[now].ls].siz+1) break;
else k-=t[t[now].ls].siz+1,now=t[now].rs;
}
printf("%d\n" , t[now].val) ;
}
void get_pre(int ver){
split(root,ver-1,x,y);
int cur=x;
while(t[cur].rs) cur=t[cur].rs;
printf("%d\n" , t[cur].val) ;
root=Merge(x,y);
}
void get_nxt(int ver){
split(root,ver,x,y);
int cur=y;
while(t[cur].ls) cur=t[cur].ls;
printf("%d\n" , t[cur].val) ;
root=Merge(x,y);
}
int main(){
srand(time(0));
scanf("%d",&n);
while(n--){
int op,x;
scanf("%d%d",&op,&x);
if(op==1){
insert(x);
} else if(op==2){
Delete(x);
} else if(op==3){
get_rand(x);
} else if(op==4){
kth(x);
} else if(op==5){
get_pre(x);
} else if(op==6){
get_nxt(x);
}
}
return 0;
}
向各位巨佬请教