#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int ls[N], rs[N], pri[N], val[N], size[N], cnt, rt;
inline void pushup(int p) {
size[p] = size[ls[p]] + size[rs[p]] + 1;
}
inline int build(int w) {
val[++cnt] = w;
size[cnt] = 1;
pri[cnt] = rand();
return cnt;
}
inline void split(int p, int w, int &x, int &y) {
if(!p) {
x = y = 0;
return;
} else if(w >= val[p]) {
x = p;
split(rs[p], w, rs[p], y);
} else {
y = p;
split(ls[p], w, x, ls[p]);
}
pushup(p);
}
inline int merge(int x, int y) {
if(!x || !y) return x + y;
if(pri[x] > pri[y]) {
rs[x] = merge(rs[x], y);
pushup(x);
return x;
} else {
ls[y] = merge(x, rs[y]);
pushup(y);
return y;
}
}
inline void insert(int w) {
int x, y;
split(rt, w - 1, x, y);
rt = merge(merge(x, build(w)), y);
}
inline void erase(int w) {
int x, y, z;
split(rt, w, x, z);
split(x, w - 1, x, y);
if(y) y = merge(ls[y], rs[y]);
rt = merge(merge(x, y), z);
}
inline int getpre(int w) {
int x, y, z;
split(rt, w - 1, x, y);
z = x;
while(rs[x]) x = rs[x];
int res = val[x];
rt = merge(z, y);
return res;
}
inline int getsuc(int w) {
int x, y, z;
split(rt, w, x, y);
z = y;
while(ls[y]) y = ls[y];
int res = val[y];
rt = merge(x, z);
return res;
}
inline int getrk(int w) {
int x, y;
split(rt, w - 1, x, y);
int res = size[x] + 1;
rt = merge(x, y);
return res;
}
inline int getkth(int p, int k) {
if(k == size[ls[p]] + 1) return val[p];
else if(k < size[ls[p]] + 1) return getkth(ls[p], k);
else return getkth(rs[p], k - size[ls[p]] - 1);
}
int main() {
int q, op, a, b, c;
scanf("%d", &q);
while(q--) {
scanf("%d%d", &op, &a);
if(op == 1) insert(a);
if(op == 2) erase(a);
if(op == 3) printf("%d\n", getrk(a));
if(op == 4) printf("%d\n", getkth(rt, a));
if(op == 5) printf("%d\n", getpre(a));
if(op == 6) printf("%d\n", getsuc(a));
}
return 0;
}