hdu2852KiKi's K-Number(区间K值)
http://acm.hdu.edu.cn/showproblem.php?pid=2852
区间K值写错了。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 #define N 100010 8 #define lowbit(x) (x&(-x)) 9 int s[N<<2],ff[N]; 10 void add(int p,int da,int l,int r,int w) 11 { 12 if(l==r) 13 { 14 s[w]+=da; 15 return ; 16 } 17 int m = (l+r)>>1; 18 if(p>m) 19 add(p,da,m+1,r,w<<1|1); 20 else 21 add(p,da,l,m,w<<1); 22 s[w] = s[w<<1]+s[w<<1|1]; 23 } 24 int getsum(int a,int b,int l,int r,int w) 25 { 26 if(a<=l&&b>=r) 27 return s[w]; 28 int m = (l+r)>>1,ans=0; 29 if(a<=m) 30 ans+=getsum(a,b,l,m,w<<1); 31 if(b>m) 32 ans+=getsum(a,b,m+1,r,w<<1|1); 33 return ans; 34 } 35 int query(int k,int l,int r,int w) 36 { 37 if(l==r) 38 return l; 39 int m = (l+r)>>1; 40 if(k<=s[w<<1]) 41 return query(k,l,m,w<<1); 42 else 43 return query(k-s[w<<1],m+1,r,w<<1|1); 44 } 45 int main() 46 { 47 int n,a,b,c; 48 while(scanf("%d",&n)!=EOF) 49 { 50 memset(s,0,sizeof(s)); 51 memset(ff,0,sizeof(ff)); 52 while(n--) 53 { 54 scanf("%d",&a); 55 if(a==0) 56 { 57 scanf("%d",&b); 58 ff[b]++; 59 add(b,1,1,N,1); 60 } 61 else if(a==1) 62 { 63 scanf("%d",&b); 64 if(ff[b]==0) 65 printf("No Elment!\n"); 66 else 67 { 68 ff[b]--; 69 add(b,-1,1,N,1); 70 } 71 } 72 else 73 { 74 scanf("%d%d",&b,&c); 75 int s1 = getsum(1,b,1,N,1); 76 if(s[1]-s1<c) 77 printf("Not Find!\n"); 78 else 79 { 80 c+=s1; 81 int o = query(c,1,N,1); 82 printf("%d\n",o); 83 } 84 } 85 } 86 } 87 return 0; 88 }