求赞!
using namespace std;
typedef long long ll;
struct node {
ll l,r,key,val,cnt,siz;
} tr[100010];
ll n,idx,rt;
void pushup(ll p) {
tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+tr[p].cnt;
}
ll get_node(ll key) {
tr[++idx].key=key;
tr[idx].val=rand();
tr[idx].cnt=tr[idx].siz=1;
return idx;
}
void zig(ll &p) {
ll q=tr[p].l;
tr[p].l=tr[q].r,tr[q].r=p,p=q;
pushup(tr[p].r),pushup(p);
}
void zag(ll &p) {
ll q=tr[p].r;
tr[p].r=tr[q].l,tr[q].l=p,p=q;
pushup(tr[p].l),pushup(p);
}
void build() {
get_node(-1e18),get_node(1e18);
rt=1,tr[1].r=2;
pushup(rt);
if(tr[1].val<tr[2].val) zag(rt);
}
void insert(ll &p,ll key) {
if(!p) p=get_node(key);
else if(key==tr[p].key) ++tr[p].cnt;
else if(key<tr[p].key) {
insert(tr[p].l,key);
if(tr[tr[p].l].val>tr[p].val) zig(p);
} else {
insert(tr[p].r,key);
if(tr[tr[p].r].val>tr[p].val) zag(p);
}
pushup(p);
}
void remove(ll &p,ll key) {
if(!p) return;
if(key==tr[p].key) {
if(tr[p].cnt>1) --tr[p].cnt;
else if(tr[p].l || tr[p].r) {
if(!tr[p].r || tr[tr[p].l].val>tr[tr[p].r].val) {
zig(p);
remove(tr[p].r,key);
} else {
zag(p);
remove(tr[p].l,key);
}
} else p=0;
} else if(key<tr[p].key) remove(tr[p].l,key);
else remove(tr[p].r,key);
pushup(p);
}
ll rnk(ll p,ll key) {
if(key==tr[p].key) return tr[tr[p].l].siz+1;
if(key<tr[p].key) return rnk(tr[p].l,key);
return tr[tr[p].l].siz+tr[p].cnt+rnk(tr[p].r,key);
}
ll key(ll p,ll rnk) {
if(rnk<=tr[tr[p].l].siz) return key(tr[p].l,rnk);
if(rnk<=tr[tr[p].l].siz+tr[p].cnt) return tr[p].key;
return key(tr[p].r,rnk-tr[tr[p].l].siz-tr[p].cnt);
}
ll pre(ll p,ll key) {
if(!p) return -1e18;
if(key<=tr[p].key) return pre(tr[p].l,key);
return max(tr[p].key,pre(tr[p].r,key));
}
ll nxt(ll p,ll key) {
if(!p) return 1e18;
if(key>=tr[p].key) return nxt(tr[p].r,key);
return min(tr[p].key,nxt(tr[p].l,key));
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
build();
while(n--) {
ll opt,x;
cin>>opt>>x;
if(opt==1) insert(rt,x);
else if(opt==2) remove(rt,x);
else if(opt==3) cout<<rnk(rt,x)-1<<"\n";
else if(opt==4) cout<<key(rt,x+1)<<"\n";
else if(opt==5) cout<<pre(rt,x)<<"\n";
else cout<<nxt(rt,x)<<"\n";
}
return 0;
}