#include <bits/stdc++.h>
#define inf 2147483647
using namespace std;
const int maxn = 1e4 + 5;
struct treenode {
int val, lc, rc, cnt, siz;
} tree[maxn];
int q, tsiz, frt = -inf, bck = inf;
void insert(int x, int u) {
tree[u].siz++;
if (tree[u].val == x) tree[u].cnt++;
if (tree[u].val < x) {
if (tree[u].rc) {
insert(x, tree[u].rc);
} else {
tree[++tsiz].val = x;
tree[u].rc = tsiz;
tree[tsiz].cnt = tree[tsiz].siz = 1;
}
} else {
if (tree[u].lc) {
insert(x, tree[u].lc);
} else {
tree[++tsiz].val = x;
tree[u].lc = tsiz;
tree[tsiz].cnt = tree[tsiz].siz = 1;
}
}
}
inline int qrk(int x, int u) {
if (x == 0) return 1;
if (tree[u].val == x) {
return tree[tree[u].lc].siz;
} else if (tree[u].val > x) {
return qrk(x, tree[u].lc);
} else {
return tree[tree[u].lc].siz + tree[u].cnt + qrk(x, tree[u].rc);
}
}
inline int qv(int rk, int u) {
if (tree[tree[u].lc].siz >= rk) {
return qv(rk, tree[u].lc);
} else if (tree[tree[u].lc].siz + tree[u].cnt >= rk) {
return tree[u].val;
} else {
return qv(rk - tree[tree[u].lc].siz - tree[u].cnt, tree[u].rc);
}
}
inline int qfrt(int x, int u) {
if (!x) return -inf;
if (tree[u].val >= x) {
if (tree[u].lc) {
qfrt(x, tree[u].lc);
}
} else {
frt = max(frt, tree[u].val);
if (tree[u].rc) {
qfrt(x, tree[u].rc);
}
}
}
inline int qbck(int x, int u) {
if (tree[u].val <= x) {
if (tree[u].rc) {
qbck(x, tree[u].rc);
}
} else {
bck = min(bck, tree[u].val);
if (tree[u].lc) {
qbck(x, tree[u].lc);
}
}
}
signed main() {
cin >> q;
while (q--) {
int op, x; cin >> op >> x;
if (op == 5) {
if (tsiz == 0) {
tree[++tsiz].val = x;
tree[tsiz].cnt = tree[tsiz].siz = 1;
} else {
insert(x, 1);
}
} else if (op == 1) {
cout << qrk(x, 1) + 1 << endl;
} else if (op == 2) {
cout << qv(x, 1) << endl;
} else if (op == 3) {
frt = -inf;
qfrt(x, 1);
cout << frt << endl;
} else {
bck = inf;
qbck(x, 1);
cout << bck << endl;
}
}
return 0;
}