第一个点和最后一个点A了,剩下全T,求调
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 9;
const int inf = 1e9;
struct Splay {
int son[2], fa, val, sz, cnt;
void init(int _v, int _fa) {
val = _v, fa = _fa;
sz = 1, cnt = 1;
son[0] = son[1] = 0;
}
} tr[MAXN];
int root, tot;
void push_up(int o) {
tr[o].sz = tr[tr[o].son[0]].sz + tr[tr[o].son[1]].sz + tr[o].cnt;
}
void rotate(int x) {
int y = tr[x].fa, z = tr[y].fa;
int d = x == tr[y].son[1];
tr[z].son[y == tr[z].son[1]] = x, tr[x].fa = z;
tr[y].son[d] = tr[x].son[d ^ 1], tr[tr[x].son[d ^ 1]].fa = y;
tr[x].son[d ^ 1] = y, tr[y].fa = x;
push_up(y), push_up(x);
}
void splay(int x, int k) {
while (tr[x].fa != k) {
int y = tr[x].fa, z = tr[y].fa;
if (z != k) (x == tr[y].son[0]) ^ (y == tr[z].son[0]) ? rotate(x) : rotate(y);
rotate(x);
}
if (!k) root = x;
}
void insert(int v) {
int o = root, fa = 0;
while (o && v != tr[o].val) {
fa = o;
o = tr[o].son[v > tr[o].val];
}
if (o) tr[o].cnt++;
else {
o = ++tot;
if (fa) tr[fa].son[v > tr[fa].val] = o;
tr[o].init(v, fa);
}
splay(o, 0);
}
void find(int v) {
int o = root;
while (tr[o].val != v && tr[o].son[v > tr[o].val]) o = tr[o].son[v > tr[o].val];
splay(o, 0);
}
int get_pre(int v) {
find(v);
if (tr[root].val <= v) return root;
int o = tr[root].son[0];
while (tr[o].son[1]) o = tr[o].son[1];
return tr[o].val;
}
int get_nxt(int v) {
find(v);
if (tr[root].val >= v) return root;
int o = tr[root].son[1];
while (tr[o].son[0]) o = tr[o].son[0];
return tr[o].val;
}
int get_rank(int v) {
find(v);
return tr[tr[root].son[0]].sz;
}
void remove(int v) {
int l = get_pre(v), r = get_nxt(v);
splay(l, 0); splay(r, l);
if (tr[tr[r].son[0]].cnt > 1) {
tr[tr[r].son[0]].cnt--;
splay(tr[r].son[0] , 0);
} else tr[r].son[0] = 0;
}
int get_key(int k) {
int o = root;
while (1) {
if (tr[o].son[1] && k <= tr[tr[o].son[1]].sz) o = tr[o].son[1];
else if (k > tr[tr[o].son[1]].sz + tr[o].cnt) {
k = k - tr[tr[o].son[1]].sz - tr[o].cnt;
o = tr[o].son[0];
} else return tr[o].val;
}
}
int main() {
int n;
insert(-inf);
cin >> n;
while (n--) {
int op, x;
cin >> op >> x;
if (op == 1) insert(x);
else if (op == 2) remove(x);
else if (op == 3) cout << get_rank(x) << endl;
else if (op == 4) cout << get_key(x) << endl;
else if (op == 5) cout << get_pre(x) << endl;
else cout << get_nxt(x) << endl;
}
return 0;
}