思路:三种操作,增加一个数,减少一个数,询问大于某个数的第k个数
第一种操作就是普通的update,第二个询问前先求query(x)-query(x-1)是否为0,为0就是没有这个元素,第三个操作大于某个数的第K个数相当于求第query(x)+k个数,那么二分一下就可以了
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+50;
int c[maxn];
int lowbit(int x){return x&(-x);}
void update(int i,int v)
{
while(i<=maxn)
{
c[i]+=v;
i+=lowbit(i);
}
}
int query(int i)
{
int ans = 0;
while(i)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
}
int find(int k)
{
int ans = maxn;
int l = 1,r=maxn;
while(l<=r)
{
int mid = (l+r)>>1;
if(query(mid)>=k)
ans=mid,r=mid-1;
else
l=mid+1;
}
return ans;
}
int main()
{
int q;
while(scanf("%d",&q)!=EOF)
{
memset(c,0,sizeof(c));
while(q--)
{
int op,x;
scanf("%d%d",&op,&x);
if(op==0)
update(x,1);
else if(op==1)
{
if(query(x)-query(x-1)==0)
puts("No Elment!");
else
update(x,-1);
}
else
{
int k;
scanf("%d",&k);
if(query(maxn)-query(x) < k)
puts("Not Find!");
else
printf("%d\n",find(k+query(x)));
}
}
}
}