#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct node{
int l, r, val, size, fact;
bool exist;
}tree[maxn];
int t, tot, root;
vector<int>v;
inline int read(){
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
void newnode(int &now, int val){
now = ++tot;
tree[now].val = val;
tree[now].size = tree[now].fact = 1;
tree[now].exist = true;
}
bool unbalance(int now){
if(max(tree[tree[now].l].size, tree[tree[now].r].size) > tree[now].size * 0.75
|| tree[now].size - tree[now].fact > tree[now].size * 0.3)
return true;
return false;
}
void ldr(int now){
if(!now) return;
ldr(tree[now].l);
if(tree[now].exist) v.push_back(now);
ldr(tree[now].r);
}
void lift(int l, int r, int &now){
if(l == r){
now = v[l];
tree[now].l = tree[now].r = 0;
tree[now].size = tree[now].fact = 1;
return;
}
int mid = (l + r) >> 1;
while(mid && l < mid && tree[v[mid]].val == tree[v[mid - 1]].val)
mid--;
now = v[mid];
if(l < mid) lift(l, mid - 1, tree[now].l);
else tree[now].l = 0;
lift(mid + 1, r, tree[now].r);
tree[now].size = tree[tree[now].l].size + tree[tree[now].r].size + 1;
tree[now].fact = tree[tree[now].l].fact + tree[tree[now].r].fact + 1;
}
void rebuild(int &now){
v.clear();
ldr(now);
if(v.empty()){
now = 0;
return;
}
lift(0, v.size() - 1, now);
}
void update(int now, int end){
if(!now) return;
if(tree[end].val < tree[now].val) update(tree[now].l, end);
else update(tree[now].r, end);
tree[now].size = tree[tree[now].l].size + tree[tree[now].r].size + 1;
}
void check(int &now, int end){
if(now == end) return;
if(unbalance(now)){
rebuild(now);
update(root, now);
return;
}
if(tree[end].val < tree[now].val) check(tree[now].l, end);
else check(tree[now].r, end);
}
void ins(int &now, int val){
if(!now){
newnode(now, val);
check(root, now);
return;
}
tree[now].size++;
tree[now].fact++;
if(val < tree[now].val) ins(tree[now].l, val);
else ins(tree[now].r, val);
}
void del(int now, int val){
if(tree[now].exist && tree[now].val == val){
tree[now].exist = false;
tree[now].fact--;
check(root, now);
return;
}
tree[now].fact--;
if(val < tree[now].val) del(tree[now].l, val);
else del(tree[now].r, val);
}
int getrank(int val){
int now = root, rank = 1;
while(now){
if(val <= tree[now].val) now = tree[now].l;
else{
rank += tree[now].exist + tree[tree[now].l].fact;
now = tree[now].r;
}
}
return rank;
}
int getnum(int rank){
int now = root;
while(now){
if(tree[now].exist && tree[tree[now].l].fact + tree[now].exist == rank) break;
else if(tree[tree[now].l].fact >= rank) now = tree[now].l;
else rank -= tree[tree[now].l].fact + tree[now].exist, now = tree[now].r;
}
return tree[now].val;
}
int main(){
t = read();
while(t--){
int op, x;
op = read(), x = read();
if(op == 1) ins(root, x);
else if(op == 2) del(root, x);
else if(op == 3) printf("%d\n", getrank(x));
else if(op == 4) printf("%d\n", getnum(x));
else if(op == 5) printf("%d\n", getnum(getrank(x) - 1));
else printf("%d\n", getnum(getrank(x + 1)));
}
return 0;
}