1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #include<vector>
6 using namespace std;
7 typedef long long LL;
8 const int MAXN=200000+10;
9 const int INF=0x7fffffff;
10 struct NODE{
11 NODE *ch[2];
12 int r,v;
13 int s;
14 NODE(int v=0):v(v){r=rand();s=1;ch[1]=ch[0]=NULL;}
15 bool operator < (const NODE &rhs) const {
16 return r<rhs.r;
17 }
18 int cmp(int x){
19 if(x == v) return -1;
20 return x < v ? 0 : 1;
21 }
22 void mt(){
23 s=1;
24 if(ch[0] != NULL) s+=ch[0]->s;
25 if(ch[1] != NULL) s+=ch[1]->s;
26 }
27 };
28 void rotate(NODE *&o,int d){
29 NODE *k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;
30 o->mt();k->mt();o=k;
31 }
32 void insert(NODE *&o,int x){
33 if(o == NULL) o=new NODE(x);
34 else {
35 int d=o->v > x ? 0 : 1;
36 insert(o->ch[d],x);
37 if(o->ch[d]->r > o->r) rotate(o,d^1);
38 }
39 o->mt();
40 }
41
42 void remove(NODE *&o,int x){
43 int d=o->cmp(x);
44 int ret=0;
45 if(d == -1){
46 NODE *u=o;
47 if(o->ch[1] != NULL && o->ch[0] != NULL){
48 int d2=(o->ch[0]->r > o->ch[1]->r ? 1 : 0);
49 rotate(o,d2);remove(o->ch[d2],x);
50 }
51 else {
52 if(o->ch[0] == NULL) o=o->ch[1];
53 else o=o->ch[0];
54 delete u;
55 }
56 }
57 else {
58 remove(o->ch[d],x);
59 }
60 if(o != NULL) o->mt();
61 }
62
63 NODE *find(NODE *o,int x){
64 if(o == NULL) return NULL;
65 if(x == o->v) return o;
66 return x < o->v ? find(o->ch[0],x) : find(o->ch[1],x);
67 }
68
69 int kth(NODE *o,int k){
70 if(k <= 0 || o == NULL || k > o->s) return 0;
71 int s=(o->ch[0] == NULL ? 0 : o->ch[0]->s);
72 if(k == s+1) return o->v;
73 else if(k <= s) return kth(o->ch[0],k);
74 else return kth(o->ch[1],k-s-1);
75 }
76
77 int rank(NODE *o,int x){
78 if(o == NULL) return 1;
79 if(x <= o->v) return rank(o->ch[0],x);
80 return rank(o->ch[1],x)+(o->ch[0] == NULL ? 0:o->ch[0]->s)+1;
81 }
82
83 int prec(NODE *o,int t){//小于t的最大数
84 int ans=-INF;
85 if(t > o->v){
86 if(o->ch[1] != NULL) ans=prec(o->ch[1],t);
87 return max(ans,o->v);
88 }
89 else if(o->ch[0] != NULL) ans=prec(o->ch[0],t);
90 return ans;
91 }
92
93 int succ(NODE *o,int t){//大于t的最小数
94 int ans=INF;
95 if(t < o->v){
96 if(o->ch[0] != NULL) ans=succ(o->ch[0],t);
97 return min(ans,o->v);
98 }
99 else if(o->ch[1] != NULL) ans=succ(o->ch[1],t);
100 return ans;
101 }
102
103 #define submit
104 int main(){
105 #ifdef submit
106 freopen("phs.in","r",stdin);
107 freopen("phs.out","w",stdout);
108 #endif
109 #ifdef submi
110 freopen("in.txt","r",stdin);
111 #endif
112 int m,c,v;
113 NODE *root=new NODE(INF);
114 root->r=0x7fffffff;
115 insert(root,INF);
116 scanf("%d",&m);
117 while(m--){
118 scanf("%d %d",&c,&v);
119 if(c == 1) insert(root,v);
120 else if(c == 2){
121 NODE *o=find(root,v);
122 if(o != NULL) remove(root,v);
123 }
124 else if(c == 4) printf("%d\n",kth(root,v));
125 else if(c == 3) printf("%d\n",rank(root,v));
126 else if(c == 5) printf("%d\n",prec(root,v));
127 else if(c == 6) printf("%d\n",succ(root,v));
128 }
129 return(0);
130 }