Module: 前缀和


Problem

1 /8


金额就行

Theory Click to read/hide

让有一些数组。在没有变化的情况下,我们可以快速(比一行更快)在这个数组的一个子段上找到一些函数的值。为此,我们需要使用额外的内存并进行预计算。
例如,我们需要快速求出数组某段的和。
让我们得到一个前缀和数组,其中索引 i 将是数组中索引小于或等于 i 的所有元素的总和。
一个 [] –给定数组 p[] –前缀和数组


数组计数 p:
显然 p[0] = a[0]。请注意,我们可以很容易地通过 p[i – 重新计算 p[i] 1], 因为i 前缀上的金额是 i 前缀上的金额 – 1 + a[i].
因此,计算前缀和的代码如下所示:

int a[n], p[n];
p[0] = a[0< /跨度>];
 (int i = 1;我< n;我++)
         p[i] = p[i -  1] + a[i];

此外,我们注意到段上的总和 -前缀上的两个和之间的差异。


绿色 = 红色 -蓝色
因此,如果需要求区间 [l,r] 上的和,那么答案就是 p[r] —— p[l-1].
但是,如果我 - 1 个元素可能不存在。为了不用if’s,可以输入1-indexing,a[0]和p[0]会有中性值(0为和)。
 
请注意,此技术是包含 - 排除公式的特例,因此以这种方式不仅可以存储和,还可以存储其他函数,例如乘法和异或。
 

Problem

给定一个长度为 nq 的不可变数组查询,例如“计算从 l 的数组子段的总和” r”。打印每个请求的答案。

输入
第一行包含一个数字n –数组大小 (\(1 <= n <= 10^5\)). 第二行包含 n &ndash 数字;数组元素。模数不超过\(10^9\)。 第三行包含数字q –请求数 (\(1 <= q <= 10^5\))。 后面是 q 行,每个其中包含 2 个数字:lr (\(1 <= l <= r <= n\ )).

输出
打印所有查询的答案,每个都在单独的一行上。
 

 

例子
<头> <日># <正文>
输入 输出
1
5
1 2 3 4 5
3
1 2
3 3
2 5
3
3
14