Treap模板
2018-03-07 11:04
183 查看
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int rd() { static int seed=23333; return (seed=(66666ll*seed+66666ll)&2147483647); } int n; struct treap; treap *NUL; struct treap { int t,rap,sz,num; treap *s[2]; treap(){sz=num=t=0;rap=2147483647;} treap(int x) { sz=num=1;t=x;rap=rd(); s[0]=s[1]=NUL; } void update() { sz=s[0]->sz+s[1]->sz+num; } }*root; void rotate(treap *&x,int b) { treap *p=x->s[b]; x->s[b]=p->s[b^1]; p->s[b^1]=x; x->update();p->update(); x=p; } void ins(treap *&x,int v) { if(x==NUL) x=new treap(v); else if(x->t==v) x->num++; else { int b=x->t<v; ins(x->s[b],v); if(x->s[b]->rap>x->rap) rotate(x,b); } x->update(); } void erase(treap *&x) { if(x->s[0]==NUL&&x->s[1]==NUL) {x=NUL;return ;} int b=x->s[0]->rap>x->s[1]->rap; rotate(x,b); erase(x->s[b^1]); x->update(); } void del(treap *&x,int v) { if(x->t==v) { if(!(--x->num)) erase(x); else x->update(); return ; } int b=(v>x->t); del(x->s[b],v); x->update(); } int rk(treap *x,int v) { if(v==x->t) return x->s[0]->sz; int b=(v>x->t); return b*(x->s[0]->sz+x->num)+rk(x->s[b],v); } int kth(treap *x,int k) { if(k>x->s[0]->sz) k-=x->s[0]->sz; else return kth(x->s[0],k); if(k<=x->num) return x->t; else return kth(x->s[1],k-x->num); } int pre(treap *x,int v) { if(x==NUL) return 0< 10099 /span>; if(x->t<v) return max(x->t,pre(x->s[1],v)); else return pre(x->s[0],v); } int suf(treap *x,int v) { if(x==NUL) return 0x7f7f7f7f; if(x->t>v) return min(x->t,suf(x->s[0],v)); else return suf(x->s[1],v); } int main() { scanf("%d",&n); NUL=new treap; NUL->s[0]=NUL->s[1]=NUL; root=NUL; while(n--) { int opt,x; scanf("%d%d",&opt,&x); if(opt==1) ins(root,x); if(opt==2) del(root,x); if(opt==3) printf("%d\n",rk(root,x)+1); if(opt==4) printf("%d\n",kth(root,x)); if(opt==5) printf("%d\n",pre(root,x)); if(opt==6) printf("%d\n",suf(root,x)); } return 0; }
相关文章推荐
- 【模板】Treap
- 【Treap模板】【指针】【luogu3369】
- Splay练习1——P3369 【模板】普通平衡树(Treap/SBT)
- HDU 4585 Shaolin(treap模板题)
- 【模板】非旋转Treap
- 洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)
- Treap 全操作模板 bzoj 3224 普通平衡树
- 4000 我的treap模板
- [模板]treap小结
- Treap 模板
- P3369 【模板】普通平衡树(Treap/SBT)
- fhq Treap模板
- HDOJ 1058 - Humble Numbers 更新Treap模板..
- ACM练级日志:Treap个人用模板
- 大白上的treap模板
- 三大平衡树(Treap + Splay + SBT)总结+模板[转]
- Treap模板
- POJ 1442 Black Box【treap模板】
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)