都是几万几千行再出错的
#include<bits/stdc++.h>
struct NODE{int val,size,l,r,cnt,h;}tree[100010];
int idx = 0,root = 0;
int getH(int node){return node == 0 ? 0 : tree[node].h;}
void updateH(int node){
if (node == 0) return;
tree[node].h = std::max(getH(tree[node].l),getH(tree[node].r)) + 1;
}
int getBalance(int node){
if (node == 0) return 0;
return getH(tree[node].l) - getH(tree[node].r);
}
int l_Rotate(int a) {
int b = tree[a].r;
int t = tree[b].l;
tree[b].l = a;tree[a].r = t;
updateH(a);updateH(b);
tree[a].size = tree[tree[a].l].size + tree[a].cnt + tree[tree[a].r].size;
tree[b].size = tree[tree[b].l].size + tree[b].cnt + tree[tree[b].r].size;
return b;
}
int r_Rotate(int a){
int b = tree[a].l,c = tree[b].l,d = tree[b].r,e = tree[a].r;
tree[b].r = a;tree[a].l = d;
updateH(a);updateH(b);
tree[a].size = tree[d].size + tree[a].cnt + tree[e].size;
tree[b].size = tree[c].size + tree[b].cnt + tree[a].size;
return b;
}
int deleteNode(int root, int val) {
if (root == 0) return 0;
if (val < tree[root].val) {
tree[root].l = deleteNode(tree[root].l, val);
} else if (val > tree[root].val) {
tree[root].r = deleteNode(tree[root].r, val);
} else {
if (tree[root].cnt > 1) {
tree[root].cnt--;
tree[root].size--;
return root;
}
if (tree[root].l == 0 || tree[root].r == 0) {
int temp = tree[root].l ? tree[root].l : tree[root].r;
if (temp == 0) return 0;
else return temp;
} else {
int temp = tree[root].r;
while (tree[temp].l != 0) {
temp = tree[temp].l;
}
tree[root].val = tree[temp].val;
tree[root].r = deleteNode(tree[root].r, tree[temp].val);
}
}
tree[root].size = tree[tree[root].l].size + tree[root].cnt + tree[tree[root].r].size;
updateH(root);
int balance = getBalance(root);
if (balance > 1 && getBalance(tree[root].l) >= 0) {
return r_Rotate(root);
}
if (balance > 1 && getBalance(tree[root].l) < 0) {
tree[root].l = l_Rotate(tree[root].l);
return r_Rotate(root);
}
if (balance < -1 && getBalance(tree[root].r) <= 0) {
return l_Rotate(root);
}
if (balance < -1 && getBalance(tree[root].r) > 0) {
tree[root].r = r_Rotate(tree[root].r);
return l_Rotate(root);
}
return root;
}
int insert(int root,int val){
if (root == 0){
tree[++idx] = {val,1,0,0,1};
return idx;
}
if (val < tree[root].val) tree[root].l = insert(tree[root].l,val);
else if (val == tree[root].val) ++tree[root].cnt;
else tree[root].r = insert(tree[root].r,val);
tree[root].size = tree[tree[root].l].size + tree[root].cnt + tree[tree[root].r].size;
updateH(root);
int balance = getBalance(root);
if (balance > 1 && val < tree[tree[root].l].val) return r_Rotate(root);
if (balance < -1 && val > tree[tree[root].r].val) return l_Rotate(root);
if (balance > 1 && val > tree[tree[root].l].val){
tree[root].l = l_Rotate(tree[root].l);
return r_Rotate(root);
}
if (balance < -1 && val < tree[tree[root].r].val){
tree[root].r = r_Rotate(tree[root].r);
return l_Rotate(root);
}
return root;
}
int rk(int root,int val){
if (root == 0) return 0;
int l_size = tree[tree[root].l].size;
if (val < tree[root].val) return rk(tree[root].l,val);
else if (val == tree[root].val) return l_size;
else return rk(tree[root].r,val) + l_size + tree[root].cnt;
}
int kth(int root,int k){
if (root == 0) return 0;
int l_size = tree[tree[root].l].size;
if (k <= l_size) return kth(tree[root].l,k);
else if (k <= l_size + tree[root].cnt) return tree[root].val;
else return kth(tree[root].r,k - l_size - tree[root].cnt);
}
int main(){
std::cin.tie(0)->sync_with_stdio(0);
int n;std::cin >> n;
while (n--){
int op,x;std::cin >> op >> x;
if (op == 1) root = insert(root,x);
else if (op == 2) root = deleteNode(root,x);
else if (op == 3) std::cout << rk(root,x) + 1 << '\n';
else if (op == 4) std::cout << kth(root,x) << '\n';
else if (op == 5) std::cout << kth(root,rk(root,x)) << '\n';
else std::cout << kth(root,rk(root,x + 1) + 1) << '\n';
}
return 0;
}