#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,size,root,ans; struct node{ int l,r,v,size,rnd,w; }tr[200005]; inline int update(int k) { tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; } inline int rturn(int &k) { int t=tr[k].l; tr[k].l=tr[t].r; tr[t].r=k; tr[t].size=tr[k].size; update(k); k=t; } inline int lturn(int &k) { int t=tr[k].r; tr[k].r=tr[t].l; tr[t].l=k; tr[t].size=tr[k].size; update(k); k=t; } inline void insert(int &k,int x) { if(!k) { size++; k=size; tr[k].w=tr[k].size=1; tr[k].rnd=rand(); tr[k].v=x; return ; } tr[k].size++; if(tr[k].v==x) tr[k].w++; else { if(tr[k].v<x) { insert(tr[k].r,x); if(tr[k].rnd>tr[tr[k].r].rnd) lturn(k); } else { insert(tr[k].l,x); if(tr[k].rnd>tr[tr[k].l].rnd) rturn(k); } } } inline void del(int &k,int x) { if(!k) return ; if(tr[k].v==x) { if(tr[k].w>1) { tr[k].size--; tr[k].w--; 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) { lturn(k); del(k,x); } else { rturn(k); del(k,x); } } } else if(x>tr[k].v) tr[k].size--,del(tr[k].r,x); else tr[k].size--,del(tr[k].l,x); } inline int find(int k,int x) { if(k==0) return 0; if(tr[k].v==x) return tr[tr[k].l].size+1; else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+find(tr[k].r,x); else return find(tr[k].l,x); } inline int num(int k,int x) { if(k==0) return 0; if(x<=tr[tr[k].l].size) return num(tr[k].l,x); else if(x>tr[tr[k].l].size+tr[k].w) return num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); else return tr[k].v; } inline int pro(int k,int x) { if(k==0) return 0; if(tr[k].v<x) { ans=k; pro(tr[k].r,x); } else pro(tr[k].l,x); } inline int succ(int k,int x) { if(k==0) return 0; if(tr[k].v>x) { ans=k; succ(tr[k].l,x); } else succ(tr[k].r,x); } int main() { scanf("%d",&n); int x,a; while(n--) { scanf("%d%d",&a,&x); if(a==1) insert(root,x); if(a==2) del(root,x); if(a==3) printf("%d\n",find(root,x)); if(a==4) printf("%d\n",num(root,x)); if(a==5) pro(root,x),printf("%d\n",tr[ans].v); if(a==6) succ(root,x),printf("%d\n",tr[ans].v); } return 0; }
|