3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
1 1 1 3 2 1
要想区间修改的话,那么节点就必须往上更新,查询时往上累加。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+5;
int C[maxn];
int n;
int lowbit(int x)
{
return (-x)&x;
}
void update(int x,int y)
{
for(int i=x; i>0;i-=lowbit(i))
C[i]+=y;
}
int query(int x)
{
int s=0;
for(int k=x; k<=n; k+=lowbit(k))
s+=C[k];
return s;
}
int main()
{
int a,b;
while(cin>>n)
{
for(int i=1; i<=n; i++)
C[i]=0;
for(int h=0;h<n;h++)
{
scanf("%d%d",&a,&b);
update(b,1);
update(a-1,-1);
}
for(int j=1;j<=n;j++)
if(j==n) printf("%d\n",query(j));
else
printf("%d ",query(j));
//printf("%d%c",query(i),i==n?'\n':' ');
}
return 0;
}
原文:http://blog.csdn.net/u013514722/article/details/40192345