样例过了,但是全部 MLE 求助
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 9;
int q,op,x,cnt,root = 1;
struct node{
int l,r,num_val,tree_size,num_cnt;
node(int _num_val_){
l = 0;
r = 0;
num_val = _num_val_;
tree_size = 1;
num_cnt = 1;
}
node(){}
} a[N];
void update(int root){
a[root].tree_size = a[a[root].l].tree_size + a[a[root].r].tree_size + a[root].num_cnt;
}
int x_rank(int x,int root){
if(root){
if(x < a[root].num_val)
return x_rank(x,a[root].l);
else if(x > a[root].num_val)
return x_rank(x,a[root].r) + a[a[root].l].tree_size + a[root].num_cnt;
return a[a[root].l].tree_size + a[root].num_cnt;
}
return 1;
}
int xth_num(int x,int root){
if(x <= a[a[root].l].num_cnt)
return xth_num(x,a[root].l);
else if(x <= a[a[root].l].num_cnt + a[root].num_cnt)
return a[root].num_val;
return xth_num(x - (a[a[root].l].num_cnt + a[root].num_cnt),a[root].r);
}
void insert(int x,int root){
if(x < a[root].num_val){
if(!a[root].l){
cnt++;
a[root].l = cnt;
a[cnt] = node(x);
}
else
insert(x,a[root].l);
}
else if(x > a[root].num_val){
if(!a[root].r){
cnt++;
a[root].r = cnt;
a[cnt] = node(x);
}
else
insert(x,a[root].r);
}
else{
a[root].num_cnt++;
}
update(root);
}
int main(){
scanf("%d", &q);
cnt++;
for(int i = 1;i <= q;i++){
scanf("%d%d", &op, &x);
if(op == 1)
printf("%d\n", x_rank(x,root));
if(op == 2)
printf("%d\n", xth_num(x,root));
if(op == 3){
int tmp = x_rank(x,root);
if(tmp == 1)
printf("-2147483647\n");
else
printf("%d\n", xth_num(tmp - 1,root));
}
if(op == 4){
int tmp = x_rank(x,root);
if(tmp == a[root].tree_size)
printf("2147483647\n");
else
printf("%d\n", xth_num(tmp + 1,root));
}
if(op == 5)
insert(x,root);
}
}