---
# System prepended metadata

title: 'Zerojudge e346:區間和練習'

---

# Zerojudge e346:區間和練習
## 題敘:
給定一個長度為$n$的整數序列$A$，請回答$q$筆詢問。每筆詢問會問其中一段連續區間的總和為何。
## 輸入&輸出說明:
**輸入:**
輸入的第一行有一個整數$n$ $(1 <= n <= 200000)$，代表$A$序列的長度。

第二行有$n$個整數以空白分隔，依序表示$A$序列中的數字，其中數字的絕對值不會超過$10^9$。

第三行有一個整數$q$ $(1 <= q <= 200000)$，代表詢問的數量。

接下來有$q$行，每行有兩個個數字 $l, r$，表示詢問為序列$A$中第 $l$ 個數字到第  $r$ 個數字的總和。

*範例輸入:*
5
1 2 3 4 5
3
1 3
2 4
3 5

**輸出:**
輸出q行，每行有一個整數表示該次詢問的答案。

*範例輸出:*
6
9
12

---
## 想法與思路:

先計算數列 $A$的前綴和數列 $S$。假設: $S_0 ＝ 0 、 S_1 ＝ A_1 、 S_2 ＝ A_1 ＋ A_2 、 …… 、 Sn ＝ A_1 ＋ A_2 ＋ …… ＋ A_n$ ，則每給定一對$l$ 、 $r$值，所求即為$S_r$$-$$S_\left(l-1\right)$ 。而不用重複地用迴圈去計算 $Al ～ Ar$ 的總和。

---

## AC code

```cpp=
#include <iostream>
#define ll long long int
using namespace std;
int main() {
	ios_base::sync_with_stdio(false), cin.tie(0);
	ll amount, prefixSums[200000] = {0}, queries, left, right;
	cin >> amount;
	for (int i = 0; i < amount; ++i)
		cin >> prefixSums[i + 1], prefixSums[i + 1] += prefixSums[i];
	cin >> queries;
	while (queries--)
		cin >> left >> right, cout << prefixSums[right] - prefixSums[left - 1] << '\n';
}

```
**補充:前綴和$\left( Prefix\ Sums \right)$**
```cpp=
#include <iostream>
using namespace std;

int main() {
	cin.sync_with_stdio(false), cin.tie(0);
	int numbers, buffer;
	long long sums = 0;
	cin >> numbers;
	while (numbers--)
		cin >> buffer, cout << (sums += buffer) << ' ';
	cout << '\n';
}

//https://zerojudge.tw/ShowProblem?problemid=e339
```