用树状数组防止mle
求前k大用二分弄一下前缀和就行
ps:为什么我没打这场cf。。
/* 28*1000*1000b */ #include<bits/stdc++.h> using namespace std; #define N 1000006 int n; int c[N]; void add(int x,int v){ while(x<=n){ c[x]+=v; x+=x&-x; } } int query(int x){ int res=0; while(x){ res+=c[x]; x-=x&-x; } return res; } int main(){int q; cin>>n>>q; for(int i=1;i<=n;i++){ int x;scanf("%d",&x); add(x,1); } while(q--){int k; scanf("%d",&k); if(k>0) add(k,1); else { k*=-1; int L=1,R=n,mid,ans;//第一个c[i]>=k的地方 while(L<=R){ mid=L+R>>1; if(query(mid)>=k) ans=mid,R=mid-1; else L=mid+1; } add(ans,-1); } } for(int i=1;i<=n;i++) if(c[i]){ cout<<i<<' '; return 0; } cout<<0<<' '; }