点修改区间查询 HDU1541
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 struct Node 8 { 9 int l,r; 10 int num; 11 }bn[16000000]; 12 13 void build(int k,int l,int r) 14 { 15 bn[k].l=l; 16 bn[k].r=r; 17 bn[k].num=0; 18 if(bn[k].l==bn[k].r) 19 return ; 20 int lk=k*2; 21 int rk=lk+1; 22 int mid=(l+r)/2; 23 build(lk,l,mid); 24 build(rk,mid+1,r); 25 } 26 27 void change(int k,int i) 28 { 29 if(bn[k].l==bn[k].r&&bn[k].r==i) 30 { 31 bn[k].num++; 32 return ; 33 } 34 int lk=k*2; 35 int rk=lk+1; 36 if(bn[lk].r>=i) 37 change(lk,i); 38 else if(bn[rk].l<=i) 39 change(rk,i); 40 bn[k].num=bn[lk].num+bn[rk].num; 41 } 42 43 int search(int k,int l,int r) 44 { 45 if(bn[k].l==l&&bn[k].r==r) 46 { 47 return bn[k].num; 48 } 49 int lk=k*2; 50 int rk=lk+1; 51 if(bn[lk].r<l) 52 return search(rk,l,r); 53 else if(bn[rk].l>r) 54 return search(lk,l,r); 55 else 56 return search(lk,l,bn[lk].r)+search(rk,bn[rk].l,r); 57 } 58 int count[1640100]; 59 int main() 60 { 61 int n; 62 while(scanf("%d",&n)!=EOF) 63 { 64 build(1,0,32010); 65 int a,b; 66 memset(count,0,sizeof(count)); 67 for(int i=0;i<n;i++) 68 { 69 scanf("%d%d",&a,&b); 70 count[search(1,0,a)]++; 71 change(1,a); 72 } 73 for(int i=0;i<n;i++) 74 cout<<count[i]<<endl; 75 } 76 return 0; 77 }