经典应用:http://acm.nyist.net/JudgeOnline/problem.php?pid=108
/*
1、士兵杀敌<1>(树状数组模板)input:
5 2
1 2 3 4 5
1 3
2 4
output:
6
9
*/
#include<iostream>
#include<cstdio>
using namespace std;
int C[1000006];//保存树状数组
int n;//元素个数(即节点个数),下标从1开始
//求最小幂2的k次幂
int lowbit(int t){ return t&(t^(t-1)); }
//求前n项和
int sum(int end)
{
int sum=0;
while(end>0)
{
sum+=C[end];
end-=lowbit(end);//或也可end^=Lowbit(end);
}
return sum;
}
//对某个元素进行加减法操作
void Plus(int pos,int num)
{
while(pos<=n)
{
C[pos]+=num;
pos+=lowbit(pos);
}
}
int main()
{
int zishu,i;
scanf("%d%d",&n,&zishu);
for(i=1;i<=n;++i)
{
int temp;
scanf("%d",&temp);//输入原始序列的第i个元素
Plus(i,temp);// 第i个元素在原来为零的基础上加上temp
}
while(zishu--)
{
int min,max;
scanf("%d%d",&min,&max);
printf("%d\n",sum(max)-sum(min-1));
}
return 0;
}