#include <bits/stdc++.h>
#define N 100005
#define ALPHA 0.7
using namespace std;
int root, idx;
struct Node {
int ls, rs;
int val;
int tot;
int size;
int del;
} t[N];
void init_node(int u, int x) {
t[u].ls = t[u].rs = 0;
t[u].val = x;
t[u].size = t[u].tot = 1;
t[u].del = 1;
}
bool not_balance(int u) {
double u_alpha = (double)t[u].size * ALPHA;
double max_size = (double)max(t[t[u].ls].size, t[t[u].rs].size);
return max_size > u_alpha;
}
int order[N], cnt;
int tree_stack[N], top;
void in_order(int u) {
if (!u) return;
in_order(t[u].ls);
if (t[u].del) order[++cnt] = u;
else tree_stack[++top] = u;
in_order(t[u].rs);
}
void updata(int u) {
t[u].size = t[t[u].ls].size + t[t[u].rs].size + t[u].del;
t[u].tot = t[t[u].ls].tot + t[t[u].rs].tot + 1;
}
void build(int l, int r, int &u) {
int mid = (l + r) >> 1;
u = order[mid];
if (l == r) {
init_node(u, t[u].val);
return;
}
if (l < mid) build(l, mid - 1, t[u].ls);
else t[u].ls = 0;
if (mid < r) build(mid + 1, r, t[u].rs);
else t[u].rs = 0;
updata(u);
}
void rebuild(int &u) {
cnt = 0;
in_order(u);
if (cnt)
build(1, cnt, u);
else u = 0;
}
void insert(int &u, int x) {
if (!u) {
u = tree_stack[top--];
init_node(u, x);
return;
}
t[u].size++;
t[u].tot++;
if (x <= t[u].val) insert(t[u].ls, x);
else insert(t[u].rs, x);
if (not_balance(u)) rebuild(u);
}
int rank1(int u, int x) {
if (u == 0) return 0;
if (x > t[u].val) {
return t[t[u].ls].size + t[u].del + rank1(t[u].rs, x);
} else {
return rank1(t[u].ls, x);
}
}
void del_k(int u, int k) {
t[u].size--;
if (t[u].del && k == t[t[u].ls].size + 1) {
t[u].del = 0;
return;
}
if (k <= t[t[u].ls].size + t[u].del) del_k(t[u].ls, k);
else del_k(t[u].rs, k - t[t[u].ls].size - t[u].del);
}
void del(int x) {
int k = rank1(root, x) + 1;
del_k(root, k);
if (t[root].tot * ALPHA > t[root].size) rebuild(root);
}
int kth(int u, int k) {
if (k <= t[t[u].ls].size) return kth(t[u].ls, k);
if (k == t[t[u].ls].size + 1 && t[u].del) return t[u].val;
return kth(t[u].rs, k - t[t[u].ls].size - t[u].del);
}
int pre(int u, int x) {
if (!u) return -1e9;
if (t[u].val >= x) return pre(t[u].ls, x);
return max(t[u].val, pre(t[u].rs, x));
}
int suc(int u, int x) {
if (!u) return 1e9;
if (t[u].val <= x) return suc(t[u].rs, x);
return min(t[u].val, suc(t[u].ls, x));
}
int main() {
for (int i = N - 1; i >= 1; i--) tree_stack[++top] = i;
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int opt, x;
cin >> opt >> x;
if (opt == 1) {
insert(root, x);
} else if (opt == 2) {
del(x);
} else if (opt == 3) {
cout << rank1(root, x) + 1 << endl;
} else if (opt == 4) {
cout << kth(root, x) << endl;
} else if (opt == 5) {
cout << pre(root, x) << endl;
} else if (opt == 6) {
cout << suc(root, x) << endl;
}
}
return 0;
}