#include<bits/stdc++.h>
#define int long long
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
const int inf=1e18;
struct node{
int l,r;
int val;
int key;
int siz;
}tr[100005];
int tot,root;
int newnode(int val){
tr[++tot].val=val;
tr[tot].key=rand();
tr[tot].siz=1;
return tot;
}
void pushup(int p){
tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+1;
}
void split(int p,int v,int &x,int &y){
if(!p){
x=y=0;
return;
}
if(tr[p].val<=v){
x=p;
split(tr[p].r,v,tr[p].r,y);
}else{
y=p;
split(tr[p].l,v,x,tr[p].l);
}
pushup(p);
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(tr[x].key<tr[y].key){
tr[x].r=merge(tr[x].r,y);
pushup(x);
return x;
}else{
tr[y].l=merge(x,tr[x].l);
pushup(y);
return y;
}
}
void insert(int val){
int x,y,z;
split(root,val,x,y);
z=newnode(val);
root=merge(merge(x,z),y);
}
void del(int val){
int x,y,z;
split(root,val,x,z);
split(x,val-1,x,y);
y=merge(tr[y].l,tr[y].r);
root=merge(merge(x,y),z);
}
int getkth(int p,int k){
if(k<=tr[tr[p].l].siz){
return getkth(tr[p].l,k);
}
if(k==tr[tr[p].l].siz+1){
return p;
}
return getkth(tr[p].r,k-tr[tr[p].l].siz-1);
}
int getpre(int val){
int x,y;
split(root,val-1,x,y);
int p=getkth(x,tr[x].siz);
root=merge(x,y);
return tr[p].val;
}
int getsuc(int val){
int x,y;
split(root,val,x,y);
int p=getkth(y,1);
root=merge(x,y);
return tr[p].val;
}
int getrank(int val){
int x,y;
split(root,val-1,x,y);
int res=tr[x].siz+1;
root=merge(x,y);
return res;
}
void solve(){
srand(time(0));
int q;
cin>>q;
while(q--){
int op,x;
cin>>op>>x;
if(op==1){
insert(x);
}else if(op==2){
del(x);
}else if(op==3){
cout<<getrank(x)<<"\n";
}else if(op==4){
//debug(getkth(root,x));
cout<<tr[getkth(root,x)].val<<"\n";
}else if(op==5){
cout<<getpre(x)<<"\n";
}else if(op==6){
cout<<getsuc(x)<<"\n";
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t,multitest=0;
if(multitest)cin>>t;
else t=1;
while(t--){
solve();
}
return 0;
}
样例过了