模板—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 }
波澜前,面不惊。