treap

 1 int n,m,tot,a[maxn],l[maxm],r[maxm],s[maxm],rnd[maxm],w[maxm],v[maxm];
 2 struct rec{int l,r,rt;}t[4*maxn];
 3 inline void pushup(int k)
 4 {s[k]=s[l[k]]+s[r[k]]+w[k];}
 5 inline void rturn(int &k)
 6 {int t=l[k];l[k]=r[t];r[t]=k;s[t]=s[k];pushup(k);k=t;}
 7 inline void lturn(int &k)
 8 {int t=r[k];r[k]=l[t];l[t]=k;s[t]=s[k];pushup(k);k=t;}
 9 void ins(int &k,int num)
10 {
11     if(!k)
12     {k=++tot;v[k]=num;s[k]=w[k]=1;l[k]=r[k]=0;rnd[k]=rand();return;}
13     s[k]++;
14     if(v[k]==num)w[k]++;
15     else if(num<v[k])
16       {ins(l[k],num);if(rnd[l[k]]<rnd[k])rturn(k);}
17     else
18       {ins(r[k],num);if(rnd[r[k]]<rnd[k])lturn(k);}  
19 }
20 void del(int &k,int num)
21 {
22     if(v[k]==num)
23     {
24         if(w[k]>1){w[k]--;s[k]--;}
25         else if(l[k]*r[k]==0)k=l[k]+r[k];
26         else if(rnd[l[k]]<rnd[r[k]])
27          {rturn(k);del(k,num);}
28         else {lturn(k);del(k,num);} 
29         return;
30     }
31     s[k]--;
32     if(num<v[k])del(l[k],num);else del(r[k],num);
33 }
34 int rank(int k,int num)
35 {
36     if(!k) return 0;
37     if(v[k]==num)return s[l[k]];
38     else if(num<v[k])return rank(l[k],num);
39     else return s[l[k]]+w[k]+rank(r[k],num);
40 }
41 int pre(int k,int num)
42 {
43     if(!k)return -inf;
44     if(num<=v[k])return pre(l[k],num);
45     else 
46     {
47         int t=pre(r[k],num);
48         return t==-inf?v[k]:t;
49     }
50 }
51 int suc(int k,int num)
52 {
53     if(!k)return inf;
54     if(num>=v[k])return suc(r[k],num);
55     else
56     {
57         int t=suc(l[k],num);
58         return t==inf?v[k]:t;
59     }
60 }
View Code

%zyf大神的模板。。。过几天再自己写。。。

posted @ 2015-09-17 08:03  HTWX  阅读(99)  评论(0编辑  收藏  举报