#include<bits/stdc++.h>
#define ls(x) t[(x)].son[0]
#define rs(x) t[(x)].son[1]
#define fa(x) t[(x)].fa
using namespace std;
const int N = 1e5 + 10;
int read();
struct Node {
int v, fa, siz, cnt;
int son[2];
}t[N];
int root, tot;
bool get(int k)
{
return rs(fa(k)) == k;
}
void pushup(int k)
{
t[k].siz = t[ls(k)].siz + t[rs(k)].siz + t[k].cnt;
}
int newnode(int x)
{
t[++tot].v = x;
t[tot].siz = t[tot].cnt = 1;
return tot;
}
void rotate(int x)
{
int y = fa(x), z = fa(y); int k = get(x);
if (t[x].son[k ^ 1]) fa(t[x].son[k ^ 1]) = y;
t[y].son[k] = t[x].son[k ^ 1];
t[x].son[k ^ 1] = y; fa(y) = x; fa(x) = z;
if (z) t[z].son[y == rs(z)] = x;
pushup(y); pushup(x);
}
void splay(int x)
{
for (int f = fa(x); f = fa(x); rotate(x))
if (fa(f)) rotate(get(x) == get(f) ? f : x);
root = x;
}
void insert(int x)
{
int k = root, p = 0;
while (k && t[k].v != x)
{
p = k;
k = t[k].son[x > t[k].v];
}
if (k)
{
t[k].cnt++;
return;
}
k = newnode(x); fa(k) = p; t[p].son[x > t[p].v] = k;
splay(k);
}
void delet(int x)
{
int k = root, p = 0;
while (k && t[k].v != x)
{
p = k;
k = t[k].son[x > t[k].v];
}
if (!k)
{
splay(p);
return;
}
splay(k); int tmp = ls(k);
if (t[k].cnt > 1)
{
t[k].cnt--; t[k].siz--;
return;
}
if (!tmp)
{
root = rs(k);
fa(rs(k)) = 0;
t[k].siz = t[k].fa = t[k].v = t[k].son[0] = t[k].son[1] = t[k].cnt = 0;
return;
}
while (rs(tmp)) tmp = rs(tmp);
rs(tmp) = rs(k); fa(rs(k)) = tmp; fa(ls(k)) = 0;
t[k].siz = t[k].fa = t[k].v = t[k].son[0] = t[k].son[1] = t[k].cnt = 0;
pushup(tmp); splay(tmp);
}
int getrank(int x)
{
int ret = 1, k = root, p = 0;
while (k)
{
p = k;
if (t[k].v < x) ret += t[ls(k)].siz + t[k].cnt, k = rs(k);
else k = ls(k);
}
splay(p); return ret;
}
int xth(int x)
{
int k = root;
while (k)
{
int smin = t[ls(k)].siz + 1, smax = t[ls(k)].siz + t[k].cnt;
if (smin > x) k = ls(k);
else if (x >= smin && x <= smax) break;
else x -= smax, k = rs(k);
}
splay(k); return t[k].v;
}
int getpre(int x)
{
int k = root, ret = 0, p;
while (k)
if (p = k, t[k].v >= x) k = ls(k);
else ret = t[k].v, k = rs(k);
splay(p); return ret;
}
int getnxt(int x)
{
int k = root, ret = 0, p;
while (k)
if (p = k, t[k].v <= x) k = rs(k);
else ret = t[k].v, k = ls(k);
splay(p); return ret;
}
int main()
{
int T = read();
while (T--)
{
int op = read(), x = read();
if (op == 1) insert(x);
if (op == 2) delet(x);
if (op == 3) printf("%d\n", getrank(x));
if (op == 4) printf("%d\n", xth(x));
if (op == 5) printf("%d\n", getpre(x));
if (op == 6) printf("%d\n", getnxt(x));
}
return 0;
}
int read()
{
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch>'9')
{
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}