Ordinary balanced tree (training board)

No spin Treap

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <cstdlib>
using namespace std;
const int maxn=100100,inf=0x7fffffff;

struct Treap
{
    Treap* ch[2];
    int key,val,size;
    Treap(int v){size=1,val=v,key=rand();ch[0]=ch[1]=NULL;}
    inline void tain()
      {size=1+(ch[0]?ch[0]->size:0)+(ch[1]?ch[1]->size:0);}
}*root;

typedef pair<Treap*,Treap*> D;
inline int size(Treap *o){return o?o->size:0;}

Treap *Merge(Treap *a,Treap* b)
{
    if(!a)return b;
    if(!b)return a;
    if(a->key < b->key)
     {
        a->ch[1]=Merge(a->ch[1],b);
        a->tain();
        return a;
    }
    else
     {
        b->ch[0]=Merge(a,b->ch[0]);
        b->tain();
        return b;
    }
}

D Split(Treap *o,int k)
{
    if(!o)return D(NULL,NULL);
    D y;
    if(size(o->ch[0])>=k)
     {
        y=Split(o->ch[0],k);
        o->ch[0]=y.second;
        o->tain();
        y.second=o;
    }
    else 
    {
        y=Split(o->ch[1],k-size(o->ch[0])-1);
        o->ch[1]=y.first;
        o->tain();
        y.first=o;
    }
    return y;
}

int Getkth(Treap *o,int v)
{
    if(o==NULL)return 0;
    return(o->val>=v)?Getkth(o->ch[0],v):Getkth(o->ch[1],v)+size(o->ch[0])+1;
}

inline int Findkth(int k)
{
    D x=Split(root,k-1);
    D y=Split(x.second,1);
    Treap *ans=y.first;
    root=Merge(Merge(x.first,ans),y.second);
    return ans!=NULL?ans->val:0;
}

inline void Insert(int v)
{
    int k=Getkth(root,v);
    D x=Split(root,k);
    Treap *o=new Treap(v);
    root=Merge(Merge(x.first,o),x.second);
}

void Delete(int v)
{
    int k=Getkth(root,v);
    D x=Split(root,k);
    D y=Split(x.second,1);
    root=Merge(x.first,y.second);
}

int main()
{
    int m,opt,x;scanf("%d",&m);
    while(m--)
    {
        scanf("%d%d",&opt,&x);
        switch(opt)
        {
            case 1:Insert(x);break;
            case 2:Delete(x);break;
            case 3:printf("%d\n",Getkth(root,x)+1);break;
            case 4:printf("%d\n",Findkth(x));break;
            case 5:printf("%d\n",Findkth(Getkth(root,x)));break;
            case 6:printf("%d\n",Findkth(Getkth(root,x+1)+1));break;
        }
    }
}

 

Guess you like

Origin www.cnblogs.com/Rorschach-XR/p/11008191.html