40分剩下的MLE
#include <iostream>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int n,tree[10000005],lll[10000005],rrr[10000005],rt=1,cnt=1;
#define ls(x) lll[x]
#define rs(x) rrr[x]
void push_up(int x){
tree[x]=tree[ls(x)]+tree[rs(x)];
}
void insert(int l,int r,int &root,int k){
if(!root)root=++cnt;
if(l==r){
++tree[root];
return ;
}
int mid=(l+r)>>1;
if(k<=mid)
insert(l,mid,ls(root),k);
else
insert(mid+1,r,rs(root),k);
push_up(root);
}
void remove(int l,int r,int &root,int k){
if(!root)root=++cnt;
if(l==r){
--tree[root];
return ;
}
int mid=(l+r)>>1;
if(k<=mid)
remove(l,mid,ls(root),k);
else
remove(mid+1,r,rs(root),k);
push_up(root);
}
int query1(int l,int r,int root,int ll,int rr){
// if(!root)root=++cnt;
// cout<<l<<' '<<r<<' '<<root<<' '<<ll<<' '<<rr<<endl;
if(l>=ll&&r<=rr){
return tree[root];
}
int mid=(l+r)>>1,ans=0;
if(ll<=mid)
ans+=query1(l,mid,ls(root),ll,rr);
if(rr>mid)
ans+=query1(mid+1,r,rs(root),ll,rr);
return ans;
}
int query2(int l,int r,int root,int k){
if(l==r)
return r;
int mid=(l+r)>>1;
if(k<=tree[ls(root)])
return query2(l,mid,ls(root),k);
return query2(mid+1,r,rs(root),k-tree[ls(root)]);
}
int main() {
cin>>n;
while(n--){
int p,k;
cin>>p>>k;
switch(p){
case 1:{
insert(1,1e8,rt,k);
break;
}
case 2:{
remove(1,1e8,rt,k);
break;
}
case 3:{
cout<<query1(1,1e8,rt,1,k-1)+1<<endl;
break;
}
case 4:{
cout<<query2(1,1e8,rt,k)<<endl;
break;
}
case 5:{
cout<<query2(1,1e8,rt,query1(1,1e8,rt,1,k-1))<<endl;
break;
}
case 6:{
cout<<query2(1,1e8,rt,query1(1,1e8,rt,1,k)+1)<<endl;
break;
}
}
}
return 0;
}