思路:加一个数e就用update(e,1)。删除元素e就用update(e,-1)。找比a大的第k大的元素就用二分查找。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Maxn 120010
#define lowbit(x) (x&(-x))
using namespace std;
int C[Maxn];
int Sum(int pos)
{
int sum=;
while(pos)
{
sum+=C[pos];
pos-=lowbit(pos);
}
return sum;
}
void update(int pos,int val)
{
while(pos<=)
{
C[pos]+=val;
pos+=lowbit(pos);
}
}
int main()
{
int m,i,j,p,k,e,num,a;
while(scanf("%d",&m)!=EOF)
{
num=;
memset(C,,sizeof(C));
while(m--)
{
scanf("%d",&p);
if(p==)
{
scanf("%d",&e);
update(e,);
num++;
}
if(p==)
{
scanf("%d",&e);
if(Sum(e)-Sum(e-))
{
update(e,-);
num--;
}
else
printf("No Elment!\n");
}
if(p==)
{
scanf("%d%d",&a,&k);
int l,r,mid,temp;
int mins;
mins=Sum(a);
l=a,r=;
if(!num||num-mins<k)
{
printf("Not Find!\n");
continue;
}
while(l<r)
{
mid=(l+r)>>;
temp=Sum(mid)-mins;
if(temp>=k)
r=mid;
else
l=mid+;
}
if(r>a)
printf("%d\n",r);
else
printf("Not Find!\n");
}
}
}
return ;
}
05-11 13:58