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 }
%zyf大神的模板。。。过几天再自己写。。。