#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; struct node{ int l, r, val, height, size; }tree[maxn]; int t, tot, root; 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; } inline void print(int x){ if(x < 0) x = ~x + 1, putchar('-'); if(x > 9) print(x / 10); putchar(x % 10 + '0'); } inline void newnode(int &now, int val){ tree[now=++tot].val = val; tree[tot].size = 1; } inline void update(int now){ tree[now].size = tree[tree[now].l].size + tree[tree[now].r].size + 1; tree[now].height = max(tree[tree[now].l].height, tree[tree[now].r].height) + 1; } inline int factor(int now){///获取平衡因子 return tree[tree[now].l].height - tree[tree[now].r].height; } inline void lrotate(int &now){///左旋 int r = tree[now].r; tree[now].r = tree[r].l; tree[r].l = now; now = r; update(tree[now].l), update(now); } inline void rrotate(int &now){///右旋 int l = tree[now].l; tree[now].l = tree[l].r; tree[l].r = now; now = l; update(tree[now].r), update(now); } inline void check(int &now){ int nf = factor(now); if(nf > 1){ int lf = factor(tree[now].l); if(lf > 0) rrotate(now); ///LL else lrotate(tree[now].l), rrotate(now); ///LR } else if(nf < -1){ int rf = factor(tree[now].r); if(rf < 0) lrotate(now); ///RR else rrotate(tree[now].r), lrotate(now); ///RL } else if(now) update(now); } void ins(int &now, int val){ if(!now) newnode(now, val); else if(val < tree[now].val) ins(tree[now].l, val); else ins(tree[now].r, val); check(now); } int find(int &now, int fa){///找到要删除节点的后继 int ret; if(!tree[now].l){ ret = now; tree[fa].l = tree[now].r; } else{ ret = find(tree[now].l, now); check(now); } return ret; } void del(int &now, int val){ if(val == tree[now].val){ int l = tree[now].l, r = tree[now].r; if(!l || !r) now = l + r; else{ now = find(r, r); if(now!=r) tree[now].r = r; tree[now].l = l; } } else if(val < tree[now].val) del(tree[now].l, val); else del(tree[now].r, val); check(now); } int getrank(int val){ int now = root, rank = 1; while(now){ if(val <= tree[now].val) now=tree[now].l; else{ rank += tree[tree[now].l].size + 1; now = tree[now].r; } } return rank; } int getnum(int rank){ int now = root; while(now){ if(tree[tree[now].l].size + 1 == rank) break; else if(tree[tree[now].l].size >= rank) now=tree[now].l; else{ rank -= tree[tree[now].l].size + 1; 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) print(getrank(x)), putchar('\n'); else if(op == 4) print(getnum(x)), putchar('\n'); else if(op == 5) print(getnum(getrank(x) - 1)), putchar('\n'); else print(getnum(getrank(x + 1))), putchar('\n'); } return 0; } /* * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐ * │Esc│ │ F1│ F2│ F3│ F4│ │ F5│ F6│ F7│ F8│ │ F9│F10│F11│F12│ │P/S│S L│P/B│ ┌┐ ┌┐ ┌┐ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └┘ └┘ └┘ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐ * │~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │Num│ / │ * │ - │ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│ | \ │ │Del│End│PDn│ │ 7 │ 8 │ 9 │ │ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter │ │ 4 │ 5 │ 6 │ │ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │ * ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││ * │ Ctrl│ Win│ Alt│ Space │ Alt│ Win│Menu│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │←─┘│ * └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘ */