#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;
}