rt
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
int cnt[maxn]; //存储几个点值相同
int siz[maxn]; //存储大小
int ch[maxn][2]; //存储子节点
int fa[maxn]; //存储父节点
int key[maxn]; //key存储权值
int rt,t1;
void update(int x){siz[x] = siz[ch[x][1]] + siz[ch[x][0]] + cnt[x];}
void rotate(int x){
assert(fa[x]); //备注:不一定要
int f = fa[x],g = fa[f],l = ch[f][1] == x;
fa[x] = g,fa[f] = x;
if(ch[x][1 ^ l]) fa[ch[x][1 ^ l]] = f; //备注:这里是因为如果x是父节点的右儿子,那它的左儿子就得变,总之反向的儿子必须要改变
if(g) ch[g][ch[g][1] ==f] = x; //然后依次修改节点,需要用x顶替原来的父节点位置
ch[f][1] = ch[x][1 ^ l];
ch[x][1 ^ l] = f;
update(f),update(x); //更新
}
void splay(int x){
while(fa[x]){
// printf("1");/
rotate(x);
if(fa[x] && fa[fa[x]]) //判断三点共线
rotate((ch[fa[x]][1] == x) == (ch[fa[fa[x]]][1] == fa[x])? fa[x]: x);
}rt = x;
}
void get(int x){
int u = rt;
int f = 0;
while(u){
// printf("1");
f = u;
if(x < key[u]){
u = ch[u][0];
}else if(x == key[u]){
splay(u);
return;
}else if(x > key[u]){
u = ch[u][1];
}
}
ch[f][x > key[f]] = ++t1;
fa[t1] = f;
key[t1] = x;
splay(t1);
}
void ins(int x,int det){ //同时进行插入和删除操作
get(x);
cnt[rt] += det;
update(rt);
}
int _rank(int x){
get(x); //旋转到根
return siz[ch[rt][0]] + 1;
}
int find(int x,int k){
if(k <= siz[ch[x][0]])
return find(ch[x][0], k);
if(siz[ch[x][0]] < k && k <= siz[ch[x][0]] + cnt[x])
return key[x];
return find(ch[x][1], k - siz[ch[x][0]] - cnt[x]);
}
int pre(int x){
return find(rt, _rank(x) - 1);
}
int suc(int x){
return find(rt, _rank(x + 1));
}
int n;
int opt, x;
int main(){
freopen("1.in", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d %d", &opt, &x);
if(opt == 1){
ins(x, 1);
}else if(opt == 2){
ins(x, -1);
}else if(opt == 3){
printf("%d\n",find(rt, x));
}else if(opt == 4){
printf("%d\n", _rank(x));
}else if(opt == 5){
printf("%d\n", pre(x));
}else if(opt == 6){
printf("%d\n", suc(x));
}
}
return 0;
}