只有 52pts,WA
#include<bits/stdc++.h>
#define MAXN 500010
#define INF 1000000000
using namespace std;
struct node{
int lson,rson;
int val,rnd,cnt,size;
};
int n,tot,ans,root = 0;
node tree[MAXN];
void push_up(int now){
tree[now].size = tree[tree[now].lson].size + tree[tree[now].rson].size + tree[now].cnt;
}
void turn_l(int &now){
int tmp = tree[now].rson;
tree[now].rson = tree[tmp].lson;
tree[tmp].lson = now;
now = tmp;
push_up(tree[now].lson);
push_up(now);
}
void turn_r(int &now){
int tmp = tree[now].lson;
tree[now].lson = tree[tmp].rson;
tree[tmp].rson = now;
now = tmp;
push_up(tree[now].rson);
push_up(now);
}
void insert(int x,int &now){
if(now == 0){
now = ++tot;
tree[now].val = x;
tree[now].rnd = rand();
tree[now].cnt = tree[now].size = 1;
return ;
}
if(x == tree[now].val){
tree[now].cnt++;
}else if(x < tree[now].val){
insert(x,tree[now].lson);
if(tree[now].rnd > tree[tree[now].lson].rnd) turn_r(now);
}else if(x > tree[now].val){
insert(x,tree[now].rson);
if(tree[now].rnd > tree[tree[now].rson].rnd) turn_l(now);
}
push_up(now);
}
void remove(int x,int &now){
if(now == 0) return ;
if(x == tree[now].val){
if(tree[now].cnt > 1) tree[now].cnt--;
else{
if(tree[now].lson == 0 && tree[now].rson == 0){
now = 0;
}else if(tree[now].rson == 0 || tree[tree[now].rson].rnd < tree[tree[now].lson].rnd){
turn_r(now);
remove(x,tree[now].rson);
}else if(tree[now].lson == 0 || tree[tree[now].rson].rnd > tree[tree[now].lson].rnd){
turn_l(now);
remove(x,tree[now].lson);
}
}
return ;
}
if(x < tree[now].val) remove(x,tree[now].lson);
else remove(x,tree[now].rson);
push_up(now);
}
int query_rank(int val,int now){
if(now == 0) return -1;
if(val == tree[now].val) return tree[tree[now].lson].size + 1;
else if(val < tree[now].val) return query_rank(val,tree[now].lson);
else if(val > tree[now].val) return query_rank(val,tree[now].rson) + tree[tree[now].lson].size + tree[now].cnt;
}
int query_valu(int rank,int now){
if(now == 0) return INF;
if(rank <= tree[tree[now].lson].size) return query_valu(rank,tree[now].lson);
else if(rank <= tree[tree[now].lson].size + tree[now].cnt) return tree[now].val;
else return query_valu(rank - (tree[tree[now].lson].size + tree[now].cnt),tree[now].rson);
}
int find_pre(int x,int now){
int pre = -INF;
while(now){
if(tree[now].val < x){
pre = tree[now].val;
now = tree[now].rson;
}else{
now = tree[now].lson;
}
}
return pre;
}
int find_nxt(int x,int now){
int nxt = INF;
while(now){
if(tree[now].val > x){
nxt = tree[now].val;
now = tree[now].lson;
}else{
now = tree[now].rson;
}
}
return nxt;
}
int main(){
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
scanf("%d",&n);
for(int i = 1;i <= n;i++){
int op,x;
scanf("%d%d",&op,&x);
if(op == 1) insert(x,root);
else if(op == 2) remove(x,root);
else if(op == 3) printf("%d\n",query_rank(x,root));
else if(op == 4) printf("%d\n",query_valu(x,root));
else if(op == 5) printf("%d\n",find_pre(x,root));
else if(op == 6) printf("%d\n",find_nxt(x,root));
}
}
/*
50
1 25
1 17
1 38
2 17
1 20
1 12
6 24
4 2
5 39
2 38
1 10
1 8
1 6
5 26
6 23
1 35
4 3
1 31
1 19
6 5
1 22
4 1
1 13
2 6
1 27
3 8
1 16
5 11
4 4
*/