超级MLE代码如下:~~(惨不忍睹)~~
```cpp
#include<bits/stdc++.h>
using namespace std;
int cnt,root;
struct node{
int data,left,right,sum,s;
}tree[100010];
int newnode(int e){
tree[++cnt]=node{e,0,0,1,1};
return cnt;
}
int maintain(int &x){
tree[x].s=tree[tree[x].left].s+tree[tree[x].right].s+1;
}
void insert(int &x,int e){
if(x==0){
x=newnode(e);
return;
}
if(e==tree[x].data) tree[x].sum++;
else insert((e>tree[x].data?tree[x].right:tree[x].left),e);
maintain(x);
}
int find(int x,int e){
if(x==0) return 0;
if(e==tree[x].data) return x;
return find((e>tree[x].data?tree[x].right:tree[x].left),e);
}
int findmax(int x){
return tree[x].right==0?x:findmax(tree[x].right);
}
int findmin(int x){
return tree[x].left==0?x:findmin(tree[x].left);
}
void del(int &x,int e){
if(tree[x].data==e){
if(tree[x].sum>1) tree[x].sum--;
else{
if(tree[x].left==0&&tree[x].right==0) x=0;
else if(tree[x].left&&tree[x].right==0) x=tree[x].left;
else if(tree[x].left==0&&tree[x].right) x=tree[x].right;
else{
int d=tree[x].left;
while(tree[tree[d].right].right){
tree[d].s--;
d=tree[d].right;
}
tree[d].s--;
tree[tree[d].right].s--;
tree[x].data=tree[tree[d].right].data;
tree[d].right=tree[tree[d].right].left;
}
}
}
else if(e>tree[x].data) del(tree[x].right,e);
else del(tree[x].left,e);
tree[x].s--;
}
int kth(int x,int k){
int s=tree[tree[x].left].s;
if(k>=s+1&&k<=s+tree[x].sum) return tree[x].data;
return k<=s?kth(tree[x].left,k):kth(tree[x].right,k-s-tree[x].sum);
}
int Rank(int x,int e){
e=find(x,e);
return tree[tree[e].left].s+1;
}
int findl(int x,int e){
if(x==0) return 0;
if(e==tree[x].data) return 0;
if(e<tree[x].data) return findl(tree[x].left,e);
int t=findl(tree[x].right,e);
return t?t:x;
}
int lowerbound(int x,int k){
int d=findl(x,k);
return tree[d].data?tree[d].data:tree[tree[d].left].data;
}
int findu(int x,int e){
if(x==0) return 0;
if(e==tree[x].data) return 0;
if(e>tree[x].data) return findu(tree[x].right,e);
int t=findu(tree[x].left,e);
return t?t:x;
}
int upperbound(int x,int k){
int d=findu(x,k);
return tree[d].data?tree[d].data:tree[tree[d].right].data;
}
int main(){
int n;
tree[0]=node{0,0,0,0,0};
scanf("%d",&n);
for(int i=1;i<=n;i++){
int p,x;
scanf("%d%d",&p,&x);
if(p==1) insert(root,x);
if(p==2) del(root,x);
if(p==3) printf("%d\n",Rank(root,x));
if(p==4) printf("%d\n",kth(root,x));
if(p==5) printf("%d\n",lowerbound(root,x));
if(p==6) printf("%d\n",upperbound(root,x));
}
return 0;
}
```
by 北海_Beihai @ 2018-02-05 21:54:25