思路:e的范围比较小,因此可以用树状数组来记录前e的个数,在利用二分查找来求出比a大的第k个数。
Code :
#include<iostream>
#include<cstring>
using namespace std;
const int MAX_S=100005;
int Q;
int d[MAX_S];
int C[MAX_S];
int Lowbit(int x);
void Update(int id,int x);
int Query(int id);
int main()
{
ios::sync_with_stdio(false);
while(cin>>Q){
memset(d,0,sizeof(d));
memset(C,0,sizeof(C));
int p,x,k;
while(Q--){
cin>>p>>x;
if(p==0){
d[x]++;
Update(x,1);
}else if(p==1){
if(d[x]){
d[x]--; Update(x,-1);
}else cout<<"No Elment!"<<endl;
}else if(p==2){
cin>>k;
int l=x,r=MAX_S-1,h;
int t=Query(r)-Query(x);
if(t<k) r=-1;
while(l<=r){
h=(l+r)/2;
t=Query(h)-Query(x);
if(t>=k) r=h-1;
else l=h+1;
}
if(r!=-1) cout<<l<<endl;
else cout<<"Not Find!"<<endl;
}
}
}
return 0;
}
int Lowbit(int x)
{
return x&(-x);
}
void Update(int id,int x)
{
while(id<MAX_S){
C[id]+=x;
id+=Lowbit(id);
}
}
int Query(int id)
{
int ans=0;
while(id>0){
ans+=C[id];
id-=Lowbit(id);
}
return ans;
}