# bzoj 3224 Tyvj 1728 普通平衡树

  1 /*#include<bits/stdc++.h>
2 #define N 100005
3 #define LL long long
4 #define inf 0x3f3f3f3f
5 #define ls tr[x][0]
6 #define rs tr[x][1]
7 using namespace std;
8 inline int ra()
9 {
10     int x=0,f=1; char ch=getchar();
11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
13     return x*f;
14 }
15 int n,cnt;
16 struct SPLAY{
17     int fa[N],tr[N][2],root,v[N],size[N],w[N];
18     bool which(int x){return tr[fa[x]][1]==x;}
19     void update(int x){size[x]=size[ls]+size[rs]+w[x];}
20     void rotate(int x)
21     {
22         int y=fa[x],z=fa[y]; bool nx=which(x),ny=which(y);
23         tr[y][nx]=tr[x][!nx]; fa[tr[x][!nx]]=y;
24         tr[x][!nx]=y; fa[y]=x; fa[x]=z;
25         if (z) tr[z][ny]=x; update(y);
26     }
27     void splay(int x, int aim)
28     {
29         while (fa[x]!=aim)
30         {
31             int y=fa[x],z=fa[y];
32             if (z==aim) rotate(x);
33             else if (which(x)==which(y)) rotate(y),rotate(x);
34             else rotate(x),rotate(x);
35         }
36         if (!aim) root=x; update(x);
37     }
38     void insert(int val)
39     {
40         int x=root;
41         while (1)
42         {
43             if (val==v[x]) {w[x]++;return;}
44             else if (val<v[x])   {
45                 if (!ls) {ls=++cnt,fa[cnt]=x,size[cnt]=1,splay(cnt,0),v[cnt]=val,w[cnt]=1; return;} else x=ls;}
46             else {
47                 if (!rs) {rs=++cnt,fa[cnt]=x,size[cnt]=1,splay(cnt,0),v[cnt]=val,w[cnt]=1; return;} else x=rs;}
48         }
49     }
50     int getpre(int val)
51     {
52         int x=root,pos,ans=-inf;
53         while (1)
54         {
55             if ((ls==0 && rs==0) || x==0) break;
56             if (v[x]>=val) x=ls;
57             else pos=x,x=rs;
58         }
59         return pos;
60     }
61     int getlst(int val)
62     {
63         int x=root,ans=inf,pos;
64         while (1)
65         {
66             if ((ls==0 && rs==0) || x==0) break;
67             if (v[x]<=val) x=rs;
68             else pos=x,x=ls;
69         }
70         return pos;
71     }
72     int getrank(int val)
73     {
74         int x=root,rk=0;
75         while (1)
76         {
77             if (val==v[x]) {rk+=size[ls]+1; break;}
78             else if (val>v[x]) {rk+=size[ls]+w[x]; rs=x;}
79             else x=ls;
80         }
81         return rk;
82     }
83     void del(int val)
84     {
85         int x=getrank(val),y;
86         while (ls || rs)
87         {
88             if (size[ls]>size[rs]) y=ls;
89             else y=rs;
90             rotate(y);
91         }
92         if (w[tr[fa[x]][which(x)]]==1) tr[fa[x]][which(x)]=0;
93             else w[tr[fa[x]][which(x)]]--,size[tr[fa[x]][which(x)]]--;
94         while (x=fa[x]) update(x);
95     }
96     int rank(int k)
97     {
98         int x=root;
99         while (1)
100         {
101             if (k>=size[ls]+1 && k<=size[ls]+w[x]) break;
102             else if (k<=size[ls]) x=ls;
103             else k-=(size[ls]+w[x]),x=rs;
104         }
105         return v[x];
106     }
107 }T;
108 int main()
109 {
110     n=ra();
111     T.insert(-inf); T.insert(inf);
112     for (int i=1; i<=n; i++)
113     {
114         int opt=ra(),x=ra();
115         if (opt==1) T.insert(x);
116         if (opt==2) T.del(x);
117         if (opt==3) printf("%d\n",T.getrank(x)-1);
118         if (opt==4) printf("%d\n",T.rank(x+1));
119         if (opt==5) printf("%d\n",T.v[T.getpre(x)]);
120         if (opt==6) printf("%d\n",T.v[T.getlst(x)]);
121     }
122     return 0;
123 }*/
124 #include<algorithm>
125 #include<iostream>
126 #include<cstdlib>
127 #include<cstring>
128 #include<cstdio>
129 #include<vector>
130 #include<queue>
131 #include<cmath>
132 #include<ctime>
133 #include<set>
134 #include<map>
135 using namespace std;
136 const int N=100005;
137 int fa[N],ch[N][2],size[N],v[N],mx[N];
138 int n,root,cnt;
139 void push_up(int x)
140 {
141     size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
142     mx[x]=max(v[x],max(mx[ch[x][0]],mx[ch[x][1]]));
143 }
144 void rotate(int x)
145 {
146     int y=fa[x],z=fa[y],l,r;
147     l=(ch[y][1]==x); r=l^1;
148     if(z) ch[z][ch[z][1]==y]=x;
149     ch[y][l]=ch[x][r]; ch[x][r]=y;
150     fa[ch[y][l]]=y; fa[y]=x; fa[x]=z;
151     push_up(y); push_up(x);
152     if (root==y) root=x;
153 }
154 void splay(int x)
155 {
156     while(fa[x])
157     {
158         int y=fa[x],z=fa[y];
159         if(z)
160             if(ch[z][0]==y^ch[y][0]==x) rotate(x); else rotate(y);
161         rotate(x);
162     }
163     root=x;
164 }
165 void insert(int &x,int f,int F)
166 {
167     //cout<<x<<" "<<f<<endl;
168     if(!x)
169     {
170         v[x=++cnt]=f;
171         size[x]=1;
172         mx[x]=f;
173         fa[x]=F;
174         splay(x);
175         //cout<<x<<" "<<size[x]<<" "<<ch[x][0]<<" "<<ch[x][1]<<endl;
176         return;
177     }
178     if(f<v[x]) insert(ch[x][0],f,x);
179     else insert(ch[x][1],f,x);
180 }
181 int find(int x,int f)
182 {
183     if(v[x]==f) return x;
184     else if(v[x]<f) return find(ch[x][1],f);
185     else return find(ch[x][0],f);
186 }
187 /*void del(int x)
188 {
189     int pos=find(root,x),y;
190     while(ch[pos][0]&&ch[pos][1])
191     {
192         if(size[ch[pos][0]]>size[ch[pos][1]])
193             y=ch[pos][0];
194         else y=ch[pos][1];
195         rotate(y);
196         if(pos==root) root=y;
197     }
198     y=ch[pos][0]+ch[pos][1];
199     if(y)
200     {
201         if(pos==root)
202         {
203             root=y;
204             fa[root]=0;
205         }
206         else
207         {
208             fa[y]=fa[pos];
209             ch[fa[pos]][ch[pos][1]==pos]=y;
210         }
211     }
212     else ch[fa[pos]][ch[pos][1]==pos]=0;
213     while(pos=fa[pos]) push_up(pos);
214 }*/
215
216 void del(int x)
217 {
218     int pos=find(root,x),y;
219     while(ch[pos][0]||ch[pos][1])
220     {
221         if(size[ch[pos][0]]>size[ch[pos][1]])
222             y=ch[pos][0];
223         else y=ch[pos][1];
224         rotate(y);
225     }
226     ch[fa[pos]][ch[fa[pos]][1]==pos]=0;
227     while(pos=fa[pos])
228     {
229         push_up(pos);
230         //cout<<pos<<" "<<size[pos]<<" "<<mx[pos]<<endl;
231     }
232 }
233 int rank(int x,int f,int y)
234 {
235     //cout<<v[x]<<" "<<f<<" "<<size[x]<<endl;system("pause");
236     if(v[x]==f)
237     {
238         if(mx[ch[x][0]]==f) return rank(ch[x][0],f,y);
239         return size[ch[x][0]]+1+y;
240     }
241     else if(v[x]>f) return rank(ch[x][0],f,y);
242     else return rank(ch[x][1],f,y+size[ch[x][0]]+1);
243 }
244 int num(int x,int f)
245 {
246     //cout<<x<<" "<<size[x]<<" "<<v[x]<<" "<<f<<endl; system("pause");
247     if(size[ch[x][0]]+1==f) return v[x];
248     else if(size[ch[x][0]]>=f) return num(ch[x][0],f);
249     else return num(ch[x][1],f-size[ch[x][0]]-1);
250 }
251 int pre(int x,int f)
252 {
253     if(!x) return -1e9;
254     if(v[x]<f) return max(v[x],pre(ch[x][1],f));
255     else return pre(ch[x][0],f);
256 }
257 int nxt(int x,int f)
258 {
259     if(!x) return 1e9;
260     if(v[x]>f) return min(v[x],nxt(ch[x][0],f));
261     else return nxt(ch[x][1],f);
262 }
263
264 int main()
265 {
266     mx[0]=-1e9;
267     scanf("%d",&n);
268     for(int i=1;i<=n;i++)
269     {
270         int opt,x;
271         scanf("%d%d",&opt,&x);
272         if(opt==1) insert(root,x,0);
273         else if(opt==2) del(x);
274         else if(opt==3) printf("%d\n",rank(root,x,0));
275         else if(opt==4) printf("%d\n",num(root,x));
276         else if(opt==5) printf("%d\n",pre(root,x));
277         else if(opt==6) printf("%d\n",nxt(root,x));
278     }
279     return 0;
280 }

posted @ 2017-02-12 22:31  ws_ccd  阅读(213)  评论(0编辑  收藏  举报