范浩强treap 普通平衡树

增加Split(分裂),Merge(合并)操作,非常好写,时间也不比普通treap慢什么。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 struct node
  4 {
  5     int l,r;int size,rnd,v;
  6 }t[500005*50];
  7 int cnt,rt[500005];
  8 void update(int k)
  9 {
 10     t[k].size=t[t[k].l].size+t[t[k].r].size+1;
 11 }
 12 void newnode(int &k,int x)
 13 {
 14     t[k=++cnt].v=x;t[k].size=1;t[k].rnd=rand();
 15 }
 16 int merge(int a,int b)
 17 {
 18     if(!a||!b)return a+b;
 19     if(t[a].rnd>t[b].rnd)
 20     {
 21         int p=++cnt;t[p]=t[a];
 22         t[p].r=merge(t[p].r,b);
 23         update(p);
 24         return p;
 25     }
 26     else
 27     {
 28         int p=++cnt;t[p]=t[b];
 29         t[p].l=merge(a,t[p].l);
 30         update(p);
 31         return p;
 32     }
 33 }
 34 void split(int now,int k,int &x,int &y)
 35 {
 36     if(!now)x=y=0;
 37     else
 38     {
 39         if(t[now].v<=k)
 40         {
 41             x=++cnt;t[x]=t[now];
 42             split(t[x].r,k,t[x].r,y);
 43             update(x);
 44         }
 45         else 
 46         {
 47             y=++cnt;t[y]=t[now];
 48             split(t[y].l,k,x,t[y].l);
 49             update(y);
 50         }
 51     }
 52 }
 53 void Delete(int &root,int w)
 54 {
 55     int x=0,y=0,z=0;
 56     split(root,w,x,z);
 57     split(x,w-1,x,y);
 58     y=merge(t[y].l,t[y].r);
 59     root=merge(merge(x,y),z);
 60 }
 61 void Insert(int &root,int w)
 62 {
 63     int x=0,y=0,z=0;
 64     split(root,w,x,y);
 65     newnode(z,w);
 66     root=merge(merge(x,z),y);
 67 }
 68 int getval(int k,int w)
 69 {
 70     if(w==t[t[k].l].size+1)return t[k].v;
 71     else if(w<=t[t[k].l].size)return getval(t[k].l,w);
 72     else return getval(t[k].r,w-t[t[k].l].size-1);
 73 }
 74 int getkth(int &root,int w)
 75 {
 76     int x,y;
 77     split(root,w-1,x,y);
 78     int ans=t[x].size+1;
 79     root=merge(x,y);
 80     return ans;
 81 }
 82 int getpre(int &root,int w)
 83 {
 84     int x,y,k,ans;
 85     split(root,w-1,x,y);
 86     if(!x)return -2147483647;
 87     k=t[x].size;
 88     ans=getval(x,k);
 89     root=merge(x,y);
 90     return ans;
 91 }
 92 int getnex(int &root,int w)
 93 {
 94     int x,y,ans;
 95     split(root,w,x,y);
 96     if(!y)return 2147483647;
 97     else ans=getval(y,1);
 98     root=merge(x,y);
 99     return ans;
100 }
101 int main()
102 {
103     int n,f,w,tim;
104     scanf("%d",&n);
105     for(int i=1;i<=n;++i)
106     {
107         scanf("%d%d%d",&tim,&f,&w);
108         rt[i]=rt[tim];
109         if(f==1)Insert(rt[i],w);
110         else if(f==2)Delete(rt[i],w);
111         else if(f==3)printf("%d\n",getkth(rt[i],w));
112         else if(f==4)printf("%d\n",getval(rt[i],w));
113         else if(f==5)printf("%d\n",getpre(rt[i],w));
114         else printf("%d\n",getnex(rt[i],w));
115     }
116     return 0;
117 }

 

posted @ 2017-12-03 21:46  大奕哥&VANE  阅读(616)  评论(0编辑  收藏  举报