题意:
三种操作
1 x: 在容器内删除x,不存在x则输出“No Elment”
2 x y: 在容器中找到大于x的第y个数,没有则输出“Not Find”
题解: 树状数组
操作2: 查找sum(x)和sum(x-1),差值为0则不存在x,反之,add(x,-1)即可删除一个x
操作3: 首先查找小于等于x的个数s,则找到大于x的第y个数相当于找到第s+y小数
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <map>
#define M 100005
#define INF 0x7ffffff
#define LL __int64
using namespace std;
int c[M];
int lowBit(int x)
{
return x&(-x);
}
void update(int pos,int v)
{
while(pos<M)
{
c[pos]+=v;
pos+=lowBit(pos);
}
}
int getSum(int pos)
{
int sum=0;
while(pos)
{
sum+=c[pos];
pos-=lowBit(pos);
}
return sum;
}
void cal(int a,int k)
{
int tmp=getSum(a)+k;
int l=a+1,r=M-1;
int ans=M;
while(l<r)
{
int mid=(l+r)/2;
int cnt=getSum(mid);
if(cnt<tmp)
l=mid+1;
else
{
r=mid;
if(ans>mid)
ans=mid;
}
}
if(ans==M)
printf("Not Find!\n");
else printf("%d\n",ans);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int p,e,a,k;
memset(c,0,sizeof(c));
while(n--)
{
scanf("%d",&p);
if(p==0)
{
scanf("%d",&e);
update(e,1);
}
else if(p==1)
{
scanf("%d",&e);
if(getSum(e)-getSum(e-1)==0)
printf("No Elment!\n");
else update(e,-1);
}
else
{
scanf("%d%d",&a,&k);
cal(a,k);
}
}
}
return 0;
}