HDU2852-KiKi's K-Number
http://acm.hdu.edu.cn/showproblem.php?pid=2852
#include<cstdio> #include<cstring> #include<algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 100010 using namespace std; int sum[maxn<<2]; bool vis; void update(int l,int r,int rt,int val,bool flag) { if(!flag) sum[rt]--; else sum[rt]++; if(l==r) return; int m=l+r>>1; if(val<=m) update(lson,val,flag); else update(rson,val,flag); } bool find(int l,int r,int rt,int a) { if(l==r&&l==a) { if(sum[rt]>=1) return true; else return false; } int m=l+r>>1; bool flag; if(a<=m) flag=find(lson,a); else flag=find(rson,a); return flag; } void query(int l,int r,int rt,int k) { if(l==r) { printf("%d\n",l); return; } int m=l+r>>1; if(k<=sum[rt<<1]) query(lson,k); else query(rson,k-sum[rt<<1]); } int decide(int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) return sum[rt]; int m=l+r>>1,ret=0; if(L<=m) ret+=decide(L,R,lson); if(R>m) ret+=decide(L,R,rson); return ret; } int main(void) { int m,op,a,k,t,ans,n=100000; while(scanf("%d",&m)!=EOF) { memset(sum,0,sizeof(sum)); while(m--) { scanf("%d",&op); vis=false; if(op==0) { scanf("%d",&a); update(1,n,1,a,true); } if(op==1) { scanf("%d",&a); if(!find(1,n,1,a)) printf("No Elment!\n"); else update(1,n,1,a,false); } if(op==2) { scanf("%d%d",&a,&k); t=decide(1,a,1,n,1); if(sum[1]<k+t) printf("Not Find!\n"); else query(1,n,1,k+t); } } } return 0; }