您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: