在基础上加了二分查找
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
#define M 100005
int n, a[M];
int flage;
int lowbit(int i)
{
return i&(-i);
}
void update(int i, int val)
{
while(i <= M) <span style="white-space:pre"> </span>//1
{
a[i] += val;
i += lowbit(i);
}
}
int sum(int i)
{
int sum = 0;
while(i > 0)
{
sum += a[i];
i -= lowbit(i);
}
return sum;
}
int find(int y,int z)
{
int l=y+1,r=M-1,mid;
int m=sum(y);
while(l<=r)
{
mid=(l+r)>>1;
if(sum(mid)-m<z)l=mid+1;
else r=mid-1;
}
return l;
}
int main()
{
int x,y,z;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(x==0)
{
scanf("%d",&y);
update(y,1);
}
else if(x==1)
{
scanf("%d",&y);
if(sum(y)-sum(y-1)==0)
printf("No Elment!\n");
else update(y,-1);
}
else
{
scanf("%d %d",&y,&z);
if(sum(M-1)-sum(y)<z)
printf("Not Find!\n");
else
printf("%d\n",find(y,z));
}
}
}
return 0;
}
注意: 这里由于不知道最大的输入数字是多少所以直接建立最大的树状数组,一开始还以为操作数是最大的数建了到n的树状数组.....WA TAT.....