1 /*Author:WNJXYK*/
2 #include<cstdio>
3 using namespace std;
4
5 const int Maxn=10000;
6 struct SBT{
7 int left;
8 int right;
9 int size;
10 int key;
11 };
12 SBT tree[Maxn+10];
13 int root,cnt;
14
15 inline void rotate_l(int &x){
16 int y=tree[x].right;
17 tree[x].right=tree[y].left;
18 tree[y].left=x;
19 tree[y].size=tree[x].size;
20 tree[x].size=1+tree[tree[x].left].size+tree[tree[x].right].size;
21 x=y;
22 }
23
24 inline void rotate_r(int &x){
25 int y=tree[x].left;
26 tree[x].left=tree[y].right;
27 tree[y].right=x;
28 tree[y].size=tree[x].size;
29 tree[x].size=tree[tree[x].left].size+1+tree[tree[x].right].size;
30 x=y;
31 }
32
33 void maintain(int &x,bool flag){
34 //printf("MainTain %d\n",x);
35 if (flag==false){
36 if (tree[tree[tree[x].left].left].size>tree[tree[x].right].size){
37 rotate_r(x);
38 }
39 else if (tree[tree[tree[x].left].right].size>tree[tree[x].right].size){
40 rotate_l(tree[x].left);
41 rotate_r(x);
42 }else return ;
43 }else{
44 if (tree[tree[tree[x].right].right].size>tree[tree[x].left].size){
45 rotate_l(x);
46 }else if (tree[tree[tree[x].right].left].size>tree[tree[x].left].size){
47 rotate_r(tree[x].right);
48 rotate_l(x);
49 }else return ;
50 }
51 maintain(tree[x].left,false);
52 maintain(tree[x].right,true);
53 maintain(x,true);
54 maintain(x,false);
55 }
56 void insert(int &x,int sp){
57 if (!x){
58 x=++cnt;
59 tree[x].left=tree[x].right=0;
60 tree[x].size=1;
61 tree[x].key=sp;
62 }else{
63 tree[x].size++;
64 if (sp<tree[x].key){
65 insert(tree[x].left,sp);
66 }else{
67 insert(tree[x].right,sp);
68 }
69 maintain(x,sp>=tree[x].key);
70 }
71 }
72
73 int del(int &x,int sp){
74 tree[x].size--;
75 if (sp==tree[x].key || ( sp<tree[x].key && tree[x].left==0) || (sp>tree[x].key && tree[x].right==0)){
76 int y=tree[x].key;
77 if (tree[x].left==0 ||tree[x].right==0){
78 x=tree[x].left+tree[x].right;
79 }else{
80 tree[x].key=del(tree[x].left,tree[x].key+1);
81 }
82 return y;
83 }else{
84 if (sp<tree[x].key){
85 return del(tree[x].left,sp);
86 }else{
87 return del(tree[x].right,sp);
88 }
89 }
90 }
91
92 inline int getMax(){
93 int i;
94 for (i=root;tree[i].right;i=tree[i].right);
95 return tree[i].key;
96 }
97
98 inline int getMin(){
99 int i;
100 for (i=root;tree[i].left;i=tree[i].left);
101 return tree[i].key;
102 }
103
104 int rank(int &x,int sp){
105 if (sp<tree[x].key){
106 return rank(tree[x].left,sp);
107 }else if (sp>tree[x].key){
108 return rank(tree[x].right,sp)+tree[tree[x].left].size+1;
109 }
110 return tree[tree[x].left].size+1;
111 }
112
113 int select(int &x,int rak){
114 int rk=tree[tree[x].left].size+1;
115 if (rak<rk){
116 return select(tree[x].left,rak);
117 }else if (rak>rk){
118 return select(tree[x].right,rak-rk);
119 }
120 return tree[x].key;
121 }
122
123 int pred(int &x,int y,int sp){
124 if (x==0) return y;
125 if (tree[x].key<sp){
126 return pred(tree[x].right,x,sp);
127 }
128 return pred(tree[x].left,y,sp);
129 }
130
131 int succ(int &x,int y,int sp){
132 if (x==0) return y;
133 if (tree[x].key>sp){
134 return succ(tree[x].left,x,sp);
135 }
136 return succ(tree[x].right,y,sp);
137 }
138
139 inline void init(){
140 root=cnt=0;
141 }
142
143 int main(){
144 init();
145 return 0;
146 }