https://www.51nod.com/Challenge/Problem.html#!#problemId=1081
给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和。
例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1。3 + 7 + 9 = 19,输出19。
输入
第1行:一个数N,N为数组的长度(2 <= N <= 50000)。
第2 至 N + 1行:数组的N个元素。(-10^9 <= N[i] <= 10^9)
第N + 2行:1个数Q,Q为查询的数量。
第N + 3 至 N + Q + 2行:每行2个数,i,l(1 <= i <= N,i + l <= N)
输出
共Q行,对应Q次查询的计算结果。
输入样例
5
1
3
7
9
-1
4
1 2
2 2
3 2
1 5
输出样例
4
10
16
19

线段树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a, b, sizeof(a))
#define rep(i,a,b) for (int (i) = (a); i < (b); ++(i))
#define repd(i,a,b) for (int (i) = (a); i > (b); --(i))
typedef long long ll;
const int INF=0x3f3f3f3f;
#define M 50000+5
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
ll sum[M<<2];
inline void PushPlus(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Build(int l,int r,int rt){
if(l==r){
scanf("%lld",&sum[rt]);
return ;
}
int m=(l+r)>>1;
Build(lson);
Build(rson);
PushPlus(rt);
}
ll Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m=(l+r)>>1;
ll ans=0;
if(L<=m)
ans+=Query(L,R,lson);
if(R>m)
ans+=Query(L,R,rson);
return ans;
}
int n,m,i,l;
int main(){
freopen("in","r",stdin);
scanf("%d",&n);
Build(1,n,1);
scanf("%d",&m);
while(m--){
scanf("%d%d",&i,&l);
printf("%lld\n",Query(i,i+l-1,1,n,1));
}
return 0;
}