#include <bits/stdc++.h>
using namespace std;
double ahpla = 0.2;
int n, m, opt[100001], x[100001], b[100001];
struct node {
int val, num, size, sd, ls, rs;
} re[100001];
int tot, root;
int add(int val, int num) {
re[++tot] = {val, num, num, 1, 0, 0};
return tot;
}
void pushup(int p) {
re[p].size = re[re[p].ls].size + re[re[p].rs].size + re[p].num;
re[p].sd = re[re[p].ls].sd + re[re[p].rs].sd + bool(re[p].num);
}
bool can(int p) {
if (re[p].num && (re[p].size * ahpla >= max(re[re[p].ls].size, re[re[p].rs].size) || re[p].sd <= ahpla * re[p].size) )return 1;
return 0;
}
int st[100001];
int top;
void heisou(int p) {
if (!p) return;
if (re[p].ls) heisou(re[p].ls);
if (re[p].num) st[top++] = p;
if (re[p].rs) heisou(re[p].rs);
}
int rt(int l, int r) {
int mid = (l + r) / 2;
if (l >= r) return 0;
re[st[mid]].ls = rt(l, mid);
re[st[mid]].rs = rt(mid + 1, r);
pushup(st[mid]);
return st[mid];
}
void rg(int &p) {
if (!can(p)) return ;
top = 0;
heisou(p);
p = rt(0, top);
}
void init() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> opt[i] >> x[i];
}
void insert(int val, int t = root) {
if (!t) {
t = add(val, 1);
return ;
}
int pa = t,o=-1;
while (t && re[t].val != val) {
if (re[t].val < val) {
pa = t;
o=0;
t = re[t].ls;
} else if (re[t].val > val) {
pa = t;
o=1;
t = re[t].rs;
}
}
t = add(val, 1);
if()
pushup(t);
rg(t);
}
void del(int val, int t = root) {
if (re[t].val == val)
re[t].num--;
if (val < re[t].val) del(val, re[t].ls);
if (val > re[t].val) del(val, re[t].rs);
pushup(t);
rg(t);
}
int findkth(int x, int t = root) {
if (!t) return 0;
if (x <= re[re[t].ls].size) return findkth(x, re[t].ls);
if (x <= re[re[t].ls].size + re[t].num) return re[t].val;
return findkth(x - (re[re[t].ls].size + re[t].num), re[t].rs);
}
int myupgrt(int x, int t = root) {
if (!t) return 0;
if (re[t].val == x && re[t].num)
return re[re[t].ls].size;
else if (re[t].val < x)
return re[re[t].ls].size + re[t].num + myupgrt(x, re[t].rs);
return myupgrt(x, re[t].ls);
}
int myupbd(int x, int t = root) {
if (!t) return 1;
if (re[t].val == x && re[t].num)
return re[re[t].ls].size + 1 + re[t].num;
if (x < re[t].val)
return myupbd(x, re[t].ls);
return re[re[t].ls].size + re[t].num + myupbd(x, re[t].rs);
}
int main() {
init();
for (int i = 0; i < n; i++) {
if (opt[i] == 1)
insert(x[i]);
if (opt[i] == 2)
del(x[i]);
if (opt[i] == 3)
cout << myupgrt(x[i]) + 1 << endl;
if (opt[i] == 4)
cout << findkth(x[i]) << endl;
if (opt[i] == 5)
cout << findkth(myupgrt(x[i])) << endl;
if (opt[i] == 6)
cout << findkth(myupbd(x[i])) << endl;
}
}