树状数组
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #define N 100005 #define lowbit(x) (x)&(-x) int x,y,c[N]; void update(int i,int k) { while(i<=N) { c[i]+=k; i+=lowbit(i); } } int getsum(int i) { int sum=0; while(i>0) { sum+=c[i]; i-=lowbit(i); } return sum; } void find(int x) { int l=x+1,r=N,mid,temp,t; temp=getsum(x); if(getsum(N)-temp<y) {printf("Not Find!\n");return ;} while(l<r) { mid=(l+r)>>1; t=getsum(mid); if(t==temp+y) r=mid; else if(t>temp+y) r=mid; else l=mid+1; } printf("%d\n",r); return ; } int main() { int m,i,p; while(~scanf("%d",&m)) { memset(c,0,sizeof(c)); for(i=0;i<m;i++) { scanf("%d",&p); if(!p) { scanf("%d",&x); update(x,1); } else if(p==1) { scanf("%d",&x); if(getsum(x)-getsum(x-1)) update(x,-1); else printf("No Elment!\n"); } else { scanf("%d%d",&x,&y); find(x); } } } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=2852
因为数据元素最大为100000,所以直接开个100000的树状数组,每加入一个数为树状数组的位置更新,每删除一个数,则用getsum(x)-getsum(x-1)判断有无此数。查询时用二分