[模板]有旋treap

 1 int nw(int num){
 2     ran[++cnt]=rand();
 3     val[cnt]=num;
 4     tot[cnt]=size[cnt]=1;
 5     return cnt;
 6 }
 7 inline void up(int now){size[now]=size[lc[now]]+size[rc[now]]+tot[now];}
 8 void zig(int &now){
 9     register int q=lc[now];
10     lc[now]=rc[q];rc[q]=now;now=q;
11     up(now);up(rc[now]);
12 }
13 void zag(int &now){
14     register int q=rc[now];
15     rc[now]=lc[q];lc[q]=now;now=q;
16     up(now);up(lc[now]);
17 }
18 void push(int &now,int num){
19     if(now==0){now=nw(num);return;}
20     if(num==val[now])tot[now]++;
21     else if(num<val[now]){
22         push(lc[now],num);
23         if(ran[now]<ran[lc[now]])zig(now);
24     }
25     else{
26         push(rc[now],num);
27         if(ran[now]>ran[rc[now]])zag(now);
28     }
29     up(now);
30 }
31 void pop(int &now,int num){
32     if(now==0)return;
33     if(num==val[now]){
34         if(tot[now]>1)tot[now]--,up(now);
35         else if(lc[now]==0&&rc[now]==0)now=0;
36         else if(rc[now]==0||ran[lc[now]]>ran[rc[now]])zig(now),pop(rc[now],num);
37         else zag(now),pop(lc[now],num);
38     }
39     else val[now]<num?pop(rc[now],num):pop(lc[now],num);
40     up(now);
41 }
42 int ask_rank(int now,int num){
43     if(now==0)return 0;
44     if(val[now]==num)return size[lc[now]]+1;
45     if(val[now]>num)return ask_rank(lc[now],num);
46     return ask_rank(rc[now],num)+size[lc[now]]+tot[now];
47 }
48 int ask_num(int now,int rank){
49     if(now==0)return 0x7fffffff;
50     if(size[lc[now]]>=rank)return ask_num(lc[now],rank);
51     if(size[lc[now]]+tot[now]>=rank)return val[now];
52     return ask_num(rc[now],rank-size[lc[now]]-tot[now]);
53 }
54 int before(int now,int num){
55     register int ans=1;
56     while(now){
57         if(num==val[now]){
58             if(lc[now]){
59                 now=lc[now];
60                 while(rc[now])now=rc[now];
61                 return val[now];
62             }
63             return val[ans];
64         }
65         if(val[now]<num&&val[now]>val[ans])ans=now;
66         now=num<val[now]?lc[now]:rc[now];
67     }
68     return val[ans];
69 }
70 int after(int now,int num){
71     register int ans=2;
72     while(now){
73         if(num==val[now]){
74             if(rc[now]){
75                 now=rc[now];
76                 while(lc[now])now=lc[now];
77                 return val[now];
78             }
79             return val[ans];
80         }
81         if(val[now]>num&&val[now]<val[ans])ans=now;
82         now=num<val[now]?lc[now]:rc[now];
83     }
84     return val[ans];
85 }
View Code

 

posted @ 2019-07-07 07:33  DeepinC  阅读(76)  评论(0编辑  收藏  举报