士兵杀敌(一)
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。
小工是南将军手下的军师,南将军现在想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。
注意,南将军可能会问很多次问题。
学长专门找的模板题,熟练模板的使用,话不多说 直接扔板子:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ZUID 1000005
using namespace std;
struct Note{
int l,r,sum;
}Tree[ZUID*4];
void Pushup(int o){
Tree[o].sum=Tree[o*2].sum+Tree[o*2+1].sum;
}
void Build(int o,int l,int r)
{
Tree[o].l=l;
Tree[o].r=r;
if(l==r)
{
int t;
scanf("%d",&t);
Tree[o].sum=t;
return ;
}
int mid=(l+r)/2;
Build(o*2,l,mid);
Build(o*2+1,mid+1,r);
Pushup(o);
}
int QuerySum(int o,int l,int r,int x,int y)
{
if (l == x && r == y)
{
return Tree[o].sum;
}
int mid = (l + r) / 2;
if (mid >= y)
return QuerySum(o*2,l,mid,x,y);
else if (x > mid)
return QuerySum(o*2+1,mid+1,r,x,y);
else
return QuerySum(o*2,l,mid,x,mid)+QuerySum(o*2+1,mid+1,r,mid+1,y);
}
int main()
{
int N,M;
while(~scanf("%d %d",&N,&M))
{ int m,n;
Build(1,1,N);
while(M--)
{
scanf("%d %d",&m,&n);
printf("%d\n",QuerySum(1,1,N,m,n));
}
}
return 0;
}