#include<bits/stdc++.h>
using namespace std;
struct node {
int c[2], fa, data, cnt, size;
void intn(int fa1, int data1) {
fa = fa1, data = data1;
cnt = size = 1;
}
};
struct pinhen_tree {
node tree[1100005];
int root, len;
void Up(int x) {
tree[x].size = tree[tree[x].c[0]].size + tree[tree[x].c[1]].size + tree[x].cnt;
}
void turn(int child) {
int father = tree[child].fa, grandpa = tree[father].fa;
bool flag = (tree[father].c[1] == child);
tree[grandpa].c[tree[grandpa].c[1] == father] = child;
tree[child].fa = grandpa;
tree[father].c[flag] = tree[child].c[flag ^ 1];
tree[tree[child].c[flag ^ 1]].fa = father;
tree[child].c[flag ^ 1] = father;
tree[father].fa = child;
Up(father), Up(child);
}
void splay(int child, int want) {
int father,grandpa;
while (tree[child].fa != want) {
father = tree[child].fa, grandpa = tree[father].fa;
if (grandpa != want)((father == tree[grandpa].c[0]) ^ (child == tree[father].c[0])) ? turn(child) : turn(father);
turn(child);
}
if (!want) root = child;
}
void find_root_and_change(int u) {
int v = root;
while (tree[v].c[u > tree[v].data] && u != tree[v].data) v = tree[v].c[u > tree[v].data];
splay(v, 0);
}
int get_past(int u) {
find_root_and_change(u);
int v = root;
if (tree[v].data < u) return v;
v = tree[v].c[0];
while (tree[v].c[1]) v = tree[v].c[1];
return v;
}
int get_then(int u) {
find_root_and_change(u);
int v = root;
if (tree[v].data > u) return v;
v = tree[v].c[1];
while (tree[v].c[0]) v = tree[v].c[0];
return v;
}
void del(int u) {
int past = get_past(u), then = get_then(u);
splay(past, 0);
splay(then, past);
int v = tree[then].c[0];
if (tree[v].cnt > 1) {
tree[v].cnt--;
splay(v, 0);
} else {
tree[then].c[0] = 0;
splay(then, 0);
}
}
int get_rank(int u) {
find_root_and_change(u);
return tree[tree[root].c[0]].size;
}
int get_vel(int k) {
int l = root;
while (1) {
int r = tree[l].c[0];
if (tree[r].size + tree[l].cnt < k) {
k -= tree[r].size + tree[l].cnt;
l = tree[l].c[1];
} else if (tree[r].size >= k) l = r;
else break;
}
splay(l, 0);
return tree[l].data;
}
void insert(int v) {
int x = root, fa1 = 0;
while (x && tree[x].data != v) {
x = tree[x].c[v > tree[x].data];
fa1 = x;
}
if (x) tree[x].cnt++;
else {
x = ++len;
tree[fa1].c[v > tree[fa1].data] = x;
tree[x].intn(fa1, v);
}
}
}t;
int n,x,y;
signed main() {
scanf("%d\n",&n);
t.insert(-1e9);
t.insert(1e9);
while(n--){
scanf("%d %d\n",&x,&y);
if(x==1)t.insert(y);
else if(x==2)t.del(y);
else if(x==3)printf("%d\n",t.get_rank(y));
else if(x==4)printf("%d\n",t.get_vel(y+1));
else if(x==5)printf("%d\n",t.tree[t.get_past(y)].data);
else printf("%d\n",t.tree[t.get_then(y)].data);
}
return 0;
}