题目描述
教室外有 NN 棵树(树的编号从 1\sim N1∼N),根据不同的位置和树种,学校已经对其进行了多年的维护。
因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。
由于已经维护了多年,每一个树都由学校的园艺人员进行了维护费用的统计。
每棵树的前期维护费用各不相同,但是由于未来需要要打药,所以有些树木的维护费用太高的话,就要重新种植。
由于维护费用也称区间分布,所以常常需要统一个区间里的树木的维护开销。
现给定一个长度为 NN 的数组 AA 以及 MM 个查询,A_iAi 表示第 ii 棵树到维护费用。对于每个查询包含一个区间,园艺人员想知道该区间内的树木维护的开销是多少。
请你编写程序帮帮他!
输入描述
每组输入的第一行有两个整数 NN和 MM。NN 代表马路的共计多少棵树,MM 代表区间的数目,NN 和 MM 之间用一个空格隔开。
接下来的一行,包含 NN 个数 A_1,A_2,\cdots,A_NA1,A2,⋯,AN,分别表示每棵树的维护费用,每个数之间用空格隔开。
接下来的 MM 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 LL 和终止点 RR 的坐标。
输出描述
输出包括 MM 行,每一行只包含一个整数,表示维护的开销。
输入输出样例
示例
输入
10 3
7 5 6 4 2 5 0 8 5 3
1 5
2 6
3 7
输出
24
22
17
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路
根据题意,a数组已初始化为[7 5 6 4 2 5 0 8 5 3 ]
题目要求某一区间的和,如 输入3 5 ,查询3到5区间的和。
最简单的方法就是遍历,从L到R,求某个区间和sum
for(int i=L;i<=R;i++) sum+=a[i];
但时间复杂度为 O m*n,可以用前缀和的方法将时间复杂度降为O1
L<R
sum[R]=a[1]+a[2]+···a[R]
sum[L]=a[1]+a[2]+···a[L]
某一区间的和就等于 sum[R]-sum[L-1]