bzoj3224
模板参(chao)考(xi)了hzwer神犇,ORZ
//treap #include<cstdio> #include<iostream> #include<cstdlib> using namespace std; struct node { int l,r,v,w,rnd,size; }; node tr[100011]; int num=0,root=0,size=0; void update(int k) { tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w; return; } void rturn(int &k) { int t;t=tr[k].l; tr[k].l=tr[t].r;tr[t].r=k; tr[t].size=tr[k].size; update(k);k=t; return; } void lturn(int &k) { int t;t=tr[k].r; tr[k].r=tr[t].l;tr[t].l=k; tr[t].size=tr[k].size; update(k);k=t; return; } void insert(int &k,int x) { if (k==0) { ++num;k=num;tr[k].size=tr[k].w=1; tr[k].v=x;tr[k].rnd=rand(); return; } tr[k].size++; if (x==tr[k].v) tr[k].w++; else if (x>tr[k].v) { insert(tr[k].r,x); if (tr[tr[k].r].rnd<tr[k].rnd) lturn(k); } else { insert(tr[k].l,x); if (tr[tr[k].l].rnd<tr[k].rnd) rturn(k); } return; } void del(int &k,int x) { if (k==0) return; if (x==tr[k].v) { if (tr[k].w>1) { tr[k].w--;tr[k].size--;return; } else { if (tr[k].l==0||tr[k].r==0) k=tr[k].l+tr[k].r; else if (tr[tr[k].l].rnd<tr[tr[k].r].rnd) { rturn(k);del(k,x); } else { lturn(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); } int query_rank(int k,int x) { if (k==0) return 0; if (x==tr[k].v) return tr[tr[k].l].size+1; if (x>tr[k].v) return tr[tr[k].l].size+tr[k].w+query_rank(tr[k].r,x); else return query_rank(tr[k].l,x); } int query_num(int k,int x) { if (x<=tr[tr[k].l].size) return query_num(tr[k].l,x); if (x>tr[tr[k].l].size+tr[k].w) return query_num(tr[k].r,x-tr[tr[k].l].size-tr[k].w); return tr[k].v; } int ans; void query_pro(int k,int x)//5 { if (k==0) return; if (tr[k].v<x) { ans=k;query_pro(tr[k].r,x); } else query_pro(tr[k].l,x); } void query_sub(int k,int x)//6 { if (k==0) return; if (tr[k].v>x) { ans=k;query_sub(tr[k].l,x); } else query_sub(tr[k].r,x); } int main() { int n; scanf("%d",&n); int ch,a,anss; for (int i=1;i<=n;i++) { scanf("%d%d",&ch,&a); //cout<<ch<<" "<<a<<endl; switch(ch) { case 1:insert(root,a);break; case 2:del(root,a);break; case 3:printf("%d\n",query_rank(root,a));break; case 4:printf("%d\n",query_num(root,a));break; case 5:ans=0,query_pro(root,a),printf("%d\n",tr[ans].v);break; case 6:ans=0,query_sub(root,a),printf("%d\n",tr[ans].v);break; } } return 0; }