普通平衡树模板那道题,我写了这个程序
然后它成功MLE on #12 了
求调QAQ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define gc getchar
#define N 100007
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int a[N],b[N],opt[N];
int ans[N*4];
int n;
void pushup(int p){
ans[p]=ans[p*2+1]+ans[p*2];
}
void change(int p,int l,int r,int x,int dist){
if(l==r){
ans[p]+=dist;
return;
}
int mid=(l+r)>>1;
if(x<=mid) change(p*2,l,mid,x,dist);
else change(p*2+1,mid+1,r,x,dist);
pushup(p);
return;
}
//L--l--mid---r---R
int query_id(int p,int l,int r,int L,int R){
if(L<=l&&R>=r){
return ans[p];
}
int mid=l+r>>1,sum=0;
if(mid>=L) sum+=query_id(p*2,l,mid,L,R);
if(mid<R) sum+=query_id(p*2+1,mid+1,r,L,R);
return sum;
}
int query_num(int p,int l,int r,int x){
if(l==r) return l;
int mid=(l+r)/2;
if(x<=ans[p*2]) return query_num(p*2,l,mid,x);
else return query_num(p*2+1,mid+1,r,x-ans[p*2]);
}
int idx[N];
int main(){
n=read();
for(int i=1;i<=n;i++){
opt[i]=read();int x=read();
if(opt[i]!=4) a[i]=x;
b[i]=x;
}
sort(a+1,a+n+1);
unique(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(opt[i]!=4) b[i]=lower_bound(a+1,a+n+1,b[i])-a;
}
for(int i=1;i<=n;i++){
int op=opt[i];
if(op==1) change(1,1,n,b[i],1);
if(op==2) change(1,1,n,b[i],-1);
if(op==3) printf("%d\n",query_id(1,1,n,1,b[i]-1)+1);
if(op==4) printf("%d\n",a[query_num(1,1,n,b[i])]);
if(op==5){
int id=query_id(1,1,n,1,b[i]-1);
printf("%d\n",a[query_num(1,1,n,id)]);
}
if(op==6){
int id=query_id(1,1,n,1,b[i]);
printf("%d\n",a[query_num(1,1,n,id+1)]);
}
}
return 0;
}