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