似乎是find的问题。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
struct bst {
int l;
int r;
int val;
int cnt;
int size;
int data;
};
int n, a, op, cnt, root;
bst tree[100009];
void height(int& x) {
tree[x].size = tree[tree[x].l].size + tree[tree[x].r].size + tree[x].cnt;
return;
}
void zig(int& x) {
int y = tree[x].l;
tree[x].l = tree[y].r;
tree[y].r = x;
height(x);
height(y);
x = y;
return;
}
void zag(int& x) {
int y = tree[x].r;
tree[x].r = tree[y].l;
tree[y].l = x;
height(x);
height(y);
x = y;
return;
}
int rnk(int val, int x) {
if(x == 0 || tree[x].val == val)
return tree[tree[x].l].size + 1;
else if(tree[x].val < val)
return tree[tree[x].l].size + tree[x].cnt + rnk(val, tree[x].r);
else
return rnk(val, tree[x].l);
}
int find(int val, int x) {
if(val <= tree[tree[x].l].size)
return find(val, tree[x].l);
else if(val == tree[tree[x].l].size + 1)
return tree[x].val;
else
return find(val - tree[tree[x].l].size - 1, tree[x].r);
}
int next(int val, int x) {
if(x == 0)
return inf;
else if(tree[x].val > val)
return min(tree[x].val, next(val, tree[x].l));
else if(tree[x].val == val) {
int ans = inf;
x = tree[x].r;
while(x) {
ans = tree[x].val;
x = tree[x].r;
}
return ans;
}
else
return next(val, tree[x].r);
}
int last(int val, int x) {
if(x == 0)
return -inf;
else if(tree[x].val > val)
return last(val, tree[x].l);
else if(tree[x].val == val) {
int ans = -inf;
x = tree[x].l;
while(x) {
ans = tree[x].val;
x = tree[x].r;
}
return ans;
}
else
return max(tree[x].val, last(val, tree[x].r));
}
void insert(int val, int& x) {
if(x == 0) {
cnt++;
x = cnt;
tree[cnt].size = 1;
tree[cnt].val = val;
tree[cnt].cnt = 1;
tree[cnt].data = rand();
return;
}
tree[x].size++;
if(tree[x].val == val)
tree[x].cnt++;
else if(tree[x].val < val) {
insert(val, tree[x].r);
if(tree[tree[x].r].data < tree[x].data)
zag(x);
}
else {
insert(val, tree[x].l);
if(tree[tree[x].l].data < tree[x].data)
zig(x);
}
}
void erase(int val, int& x) {
tree[x].size--;
if(tree[x].val == val) {
if(tree[x].cnt > 1)
tree[x].cnt--;
else if(tree[x].l && !tree[x].r) {
zig(x);
erase(val, tree[x].r);
}
else if(!tree[x].l && tree[x].r) {
zag(x);
erase(val, tree[x].l);
}
else if(!tree[x].l && !tree[x].r)
x = 0;
else if(tree[tree[x].l].data > tree[tree[x].r].data) {
zag(x);
erase(val, tree[x].l);
}
else {
zig(x);
erase(val, tree[x].r);
}
}
else if(tree[x].val < val)
erase(val, tree[x].r);
else
erase(val, tree[x].l);
}
void print(int x) {
if(tree[x].l)
print(tree[x].l);
for(int i = 1; i <= tree[x].cnt; i++)
printf("%d ", tree[x].val);
if(tree[x].r)
print(tree[x].r);
return;
}
int main() {
//freopen("P3369_7.in","r",stdin);
//freopen("P3369_7.txt","w",stdout);
srand(time(0));
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d %d", &op, &a);
if(op == 1)
insert(a, root);
else if(op == 2)
erase(a, root);
else if(op == 3)
printf("%d\n", rnk(a, root));
else if(op == 4)
printf("%d\n", find(a, root));
else if(op == 5)
printf("%d\n", last(a, root));
else
printf("%d\n", next(a, root));
}
return 0;
}