#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Splay {
int son[300005][2], val[300005], sz[300005], fa[300005], cnt[300005];
int tot = 0, rt;
void push_up(int i) { sz[i] = sz[son[i][0]] + sz[son[i][1]] + cnt[i]; }
bool get(int i) { return i == son[fa[i]][1]; }
void clear(int x) { son[x][0] = son[x][1] = sz[x] = fa[x] = cnt[x] = 1; }
void rot(int x) {
int y = fa[x], z = fa[y], chk = get(x);
son[y][chk] = son[x][chk ^ 1];
if (son[x][chk ^ 1]) fa[son[x][chk ^ 1]] = y;
son[x][chk ^ 1] = y;
fa[y] = x;
fa[x] = z;
if (z) son[z][y == son[z][1]] = x;
push_up(y); push_up(x);
}
void splay(int x) {
for (int f = fa[x]; f = fa[x]; rot(x)) if (fa[f])
rot(get(x) == get(f) ? f : x);
rt = x;
}
void insert(int k) {
if (!rt) {
val[++tot] = k;
cnt[tot]++;
rt = tot;
push_up(rt);
return;
}
int cur = rt, f = 0;
while (1) {
if (val[cur] == k) {
++cnt[cur];
push_up(cur); push_up(f);
splay(cur); break;
}
f = cur;
cur = son[cur][val[cur] < k];
if (!cur) {
val[++tot] = k;
cnt[tot]++;
fa[tot] = f;
son[f][val[f] < k] = tot;
push_up(tot);
push_up(f);
splay(tot);
break;
}
}
}
int rnk(int k) {
int res = 0, cur = rt;
while (1) {
if (k < val[cur]) cur = son[cur][0];
else {
res += sz[son[cur][0]];
if (!cur) return res + 1;
if (k == val[cur]) {
splay(cur);
return res + 1;
}
res += cnt[cur];
cur = son[cur][1];
}
}
}
int kth(int k) {
int cur = k;
while (1) {
if (sz[son[cur][0]] >= k) cur = son[cur][0];
else if (sz[son[cur][0]] + cnt[cur] >= k) {
splay(cur);
return val[cur];
} else k -= cnt[cur] + sz[son[cur][0]], cur = son[cur][1];
}
}
int pre() {
int cur = son[rt][0];
if (!cur) return cur;
while (son[cur][1]) cur = son[cur][1];
splay(cur);
return cur;
}
int nxt() {
int cur = son[rt][1];
if (!cur) return cur;
while (son[cur][0]) cur = son[cur][0];
splay(cur);
return cur;
}
void erase(int k) {
rnk(k);
if (cnt[rt] > 1) {
cnt[rt]--;
push_up(rt);
return;
}
if (!son[rt][0] && !son[rt][1]) {
clear(rt);
rt = 0; //
return;
}
if (!son[rt][0]) {
int cur = rt;
rt = son[rt][1];
fa[rt] = 0; //
clear(cur);
return;
}
if (!son[rt][1]) {
int cur = rt;
rt = son[rt][0];
fa[rt] = 0; //
clear(cur);
return;
}
int cur = rt;
int x = pre();
fa[son[cur][1]] = x;
son[x][1] = son[cur][1];
clear(cur);
push_up(rt);
}
} t;
int n, opt, x;
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> opt >> x;
if (opt == 1) {
t.insert(x);
} else if (opt == 2) {
t.erase(x);
} else if (opt == 3) {
cout << t.rnk(x) << "\n";
} else if (opt == 4) {
cout << t.kth(x) << "\n";
} else if (opt == 5) {
t.insert(x);
cout << t.val[t.pre()] << "\n";
t.erase(x);
} else {
t.insert(x);
cout << t.val[t.nxt()] << "\n";
t.erase(x);
}
}
}
(初步猜测死循环),但不知道哪里死循环了,求助。