[模板]有旋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 }
$Fate \ is \ Fake$