#include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> using namespace std; struct data{ int l,r,num,rnd,s,w; }tr[100001]; int size,root,ans,n,t,oper; void update(int k){ tr[k].s=tr[tr[k].l].s+tr[tr[k].r].s+tr[k].w; } void rrotate(int &k){ int t=tr[k].l; tr[k].l=tr[t].r; tr[t].r=k; tr[t].s=tr[k].s; update(k); k=t; } void lrotate(int &k){ int t=tr[k].r; tr[k].r=tr[t].l; tr[t].l=k; tr[t].s=tr[k].s; update(k); k=t; } void insert(int &k,int x){ if(k==0){ tr[k=++size].rnd=rand(); tr[k].num=x; tr[k].s=tr[k].w=1; return; } tr[k].s++; if(tr[k].num==x)tr[k].w++; else if(x<tr[k].num){ insert(tr[k].l,x); if(tr[tr[k].l].rnd<tr[k].rnd) rrotate(k); } else{ insert(tr[k].r,x); if(tr[tr[k].r].rnd<tr[k].rnd) lrotate(k); } } void del(int &k,int x){ if(k==0)return; else if(tr[k].num==x){ if(tr[k].w>1){tr[k].w--;tr[k].s--;return;} else if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r; else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd){ rrotate(k);del(k,x); } else{ lrotate(k);del(k,x); } } else if(x>tr[k].num){ tr[k].s--; del(tr[k].r,x); } else{ tr[k].s--; del(tr[k].l,x); } } int ask_rank(int k,int x){ if(k==0)return 0; else if(x==tr[k].num)return tr[tr[k].l].s+1; else if(x>tr[k].num)return tr[tr[k].l].s+tr[k].w+ask_rank(tr[k].r,x); else return ask_rank(tr[k].l,x); } int ask_num(int k,int x){ if(k==0)return 0; else if(x<=tr[tr[k].l].s)return ask_num(tr[k].l,x); else if(x>tr[tr[k].l].s+tr[k].w)return ask_num(tr[k].r,x-tr[tr[k].l].s-tr[k].w); else return tr[k].num; } void ask_before(int k,int x){ if(k==0)return; if(tr[k].num<x){ ans=k; ask_before(tr[k].r,x); } else ask_before(tr[k].l,x); } void ask_after(int k,int x){ if(k==0)return; if(tr[k].num>x){ ans=k; ask_after(tr[k].l,x); } else ask_after(tr[k].r,x); } int main(){ scanf("%d",&n); while(n--){ scanf("%d%d",&oper,&t); switch(oper){ case 1:{ insert(root,t); break; } case 2:{ del(root,t); break; } case 3:{ printf("%d\n",ask_rank(root,t)); break; } case 4:{ printf("%d\n",ask_num(root,t)); break; } case 5:{ ask_before(root,t); printf("%d\n",tr[ans].num); break; } case 6:{ ask_after(root,t); printf("%d\n",tr[ans].num); break; } } } return 0; }