Treap模板

#include
#include
#include
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->ts[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;
    if(x->treturn 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;
}

你可能感兴趣的:(平衡树,算法笔记)