#include <bits/stdc++.h>
using namespace std;
mt19937 rnd(20111019);
int tot, rt, size;
struct node {
int l, r;
int val, key, s;
} t[200010];
void push_up(int x) {
t[x].s = t[x].val + t[t[x].l].s + t[t[x].r].s;
}
int new_node(int val) {
++ tot;
t[tot].val = val;
t[tot].l = t[tot].r = 0;
t[tot].key = rnd();
t[tot].s = 1;
return tot;
}
void split(int p, int val, int &l, int &r) {
if (!p) {
l = r = 0;
return;
}
if (t[p].val < val) {
l = p;
split(t[p].r, val, t[p].r, r);
} else {
r = p;
split(t[p].l, val, l, t[p].l);
}
}
int merge(int l, int r) {
if (!l || !r) return l | r;
if (t[l].key > t[r].key) {
t[l].r = merge(t[l].r, r);
push_up(l);
return l;
} else {
t[r].l = merge(l, t[r].l);
push_up(r);
return r;
}
}
void insert(int val) {
int dl, dr;
split(rt, val, dl, dr);
rt = merge(merge(dl, new_node(val)), dr);
return;
}
void erase(int val) {
int dl, dr, temp;
split(rt, val, dl, dr);
split(dl, val - 1, dl, temp);
temp = merge(t[temp].l, t[temp].r);
rt = merge(merge(dl, temp), dr);
return;
}
int get_rank(int val) {
int dl, dr;
split(rt, val - 1, dl, dr);
int rnk = t[dl].s + 1;
rt = merge(dl, dr);
return rnk;
}
int rank_find(int rnk) {
int p = rt;
while (true) {
if (t[t[p].l].s + 1 == rnk) return t[p].val;
else if (t[t[p].l].s >= rnk) p = t[p].l;
else rnk -= t[t[p].l].s + 1, p = t[p].r;
}
}
int pre(int val) {
int dl, dr;
split(rt, val - 1, dl, dr);
int p = dl;
while (t[p].r) p = t[p].r;
rt = merge(dl, dr);
return t[p].val;
}
int suf(int val) {
int dl, dr;
split(rt, val, dl, dr);
int p = dr;
while (t[p].l) p = t[p].l;
rt = merge(dl, dr);
return t[p].val;
}
void solve() {
int opt, x;
scanf("%d%d", &opt, &x);
if (opt == 1) insert(x);
else if (opt == 2) erase(x);
else if (opt == 3) printf("%d\n", get_rank(x));
else if (opt == 4) printf("%d\n", rank_find(x));
else if (opt == 5) printf("%d\n", pre(x));
else printf("%d\n", suf(x));
}
int main() {
int q;
cin >> q;
while (q --) solve();
return 0;
}
求助大佬