模板treap

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #define INF 0x7fffffff
  5 using namespace std ;
  6 struct treap
  7 {
  8     int l,r,val,dat,cnt,size;
  9     #define l(x) tr[x].l
 10     #define r(x) tr[x].r
 11     #define val(x) tr[x].val
 12     #define dat(x) tr[x].dat
 13     #define cnt(x) tr[x].cnt
 14     #define size(x) tr[x].size
 15 }tr[10000010];
 16 int tot,root,n;
 17 
 18 int New(int val)
 19 {
 20     ++tot;
 21     val(tot)=val;
 22     dat(tot)=rand();
 23     size(tot)=cnt(tot)=1;
 24     return tot;
 25 }
 26 void updata(int x)
 27 {
 28     size(x)=cnt(x)+size(l(x))+size(r(x));
 29 }
 30 void build()
 31 {
 32     New(-INF),New(INF);
 33     root=1;
 34     r(1)=2;
 35     updata(root);
 36 }
 37 void zig(int &p)//you
 38 {
 39     int q=l(p);
 40     l(p)=r(q);
 41     r(q)=p;
 42     updata(p),updata(q);
 43     p=q;
 44 }
 45 void zag(int &p)//zuo
 46 {
 47     int q=r(p);
 48     r(p)=l(q);
 49     l(q)=p;
 50     updata(p),updata(q);
 51     p=q;
 52 }
 53 int grbv(int p,int val)
 54 {
 55     if(!p)return 0;
 56     if(val==val(p))return size(l(p))+1;
 57     if(val(p)>val) return grbv(l(p),val);
 58     return grbv(r(p),val)+size(l(p))+cnt(p);
 59 }
 60 int gvbr(int p,int rank)
 61 {
 62     if(!p)return INF;
 63     if(size(l(p))>=rank)return gvbr(l(p),rank);
 64     if(size(l(p))+cnt(p)>=rank)return val(p);
 65     return gvbr(r(p),rank-size(l(p))-cnt(p));
 66 }
 67 void insert(int &p,int val)
 68 {
 69     if(!p){p=New(val);return;}
 70     if(val(p)==val){cnt(p)++;updata(p);return;}
 71     if(val(p)>val)
 72     {
 73         insert(l(p),val);
 74         if(dat(l(p))>dat(p))zig(p);
 75     }
 76     else
 77     {
 78         insert(r(p),val);
 79         if(dat(r(p))>dat(p))zag(p);
 80     }    
 81     updata(p);
 82 }
 83 void remove(int &p,int val)
 84 {
 85     if(!p)return;
 86     if(val(p)==val)
 87     {
 88         if(cnt(p)>1){cnt(p)--;updata(p);return;}
 89         if(l(p) || r(p))
 90         {
 91             if(r(p)==0 || dat(l(p))>dat(r(p)))    
 92                 zig(p),remove(r(p),val);
 93             else
 94                 zag(p),remove(l(p),val);
 95             updata(p);
 96         }
 97         else p=0;
 98         return;
 99     }
100     val<val(p)?remove(l(p),val):remove(r(p),val);
101     updata(p);
102 }
103 int getpre(int val)
104 {
105     int ans=1,p=root;
106     while(p)
107     {
108         if(val(p)==val)
109         {
110             if(l(p)>0) 
111             {
112                 p=l(p);
113                 while(r(p)>0)p=r(p);
114                 ans=p;
115             }
116             break;
117         }
118         if(val(p)<val && val(p)>val(ans))ans=p;
119         p=val<val(p)?l(p):r(p);
120     }
121     return val(ans);
122 }
123 int getnext(int val)
124 {
125     int ans=2,p=root;
126     while(p)
127     {
128         if(val(p)==val)
129         {
130             if(r(p)>0)
131             {
132                 p=r(p);
133                 while(l(p)>0)p=l(p);
134                 ans=p;
135             }
136             break;
137         }
138         if(val(p)>val && val(p)<val(ans))ans=p;
139         p=val<val(p)?l(p):r(p);
140     }
141     return val(ans);
142 }
143 signed main()
144 {
145 //    freopen("input2.in","r",stdin);
146     
147     build();
148     cin>>n;
149     int  opt,x;
150     for(int i=1;i<=n;i++)
151     {
152         cin>>opt>>x;
153         if(opt==1)insert(root,x);
154         if(opt==2)remove(root,x);
155         if(opt==3)cout<<grbv(root,x)-1<<endl;
156         if(opt==4)cout<<gvbr(root,x+1)<<endl;
157         if(opt==5)cout<<getpre(x)<<endl;
158         if(opt==6)cout<<getnext(x)<<endl;
159     }
160 }

 

上一篇:fhq_treap || P3369 【模板】普通平衡树


下一篇:洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序