Модуль: Префиксные суммы


Задача

1 /8


Сумма на отрезке

Теория Нажмите, чтобы прочитать/скрыть


Пусть имеется некоторый массив. При отсутствии изменений мы можем быстро (быстрее, чем за линию) находить значение некоторых функций на подотрезке данного массива. Для этого нам необходимо использовать дополнительную память и сделать предподсчет.
Например, нам необходимо быстро находить сумму на некотором отрезке массива.
Заведем массив префиксных сумм, в котором по индексу i будет сумма всех элементов массива с индексами меньшими либо равными i.
a[] – данный массив, 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];
for (int i = 1; i < n; i++)
         p[i] = p[i - 1] + a[i];

Далее заметим, что сумма на отрезке – разница двух сумм на префиксе.


Зеленый = красный – синий
Таким образом, если необходимо найти сумму на отрезке [l,r], то ответ равен p[r] – p[l-1].
Однако, если l – 1 элемента может не существовать. Для того, чтобы обойтись без if’ов можно ввести 1-индексацию, а в a[0] и p[0] будут нейтральные значения (0 для суммы).
 
Заметим, что данный прием является частным случаем формулы включений-исключений, поэтому данным образом возможно хранить не только суммы, но и другие функции, например, умножения и xor.
 

Задача

Дан неизменяемый массив длины n и q запросов типа “вычислить сумму подотрезка массива с l по r”. Выведите ответ на каждый запрос.

Входные данные
В первой строке дано число n – размер массива (\(1 <= n <= 10^5\)). Во второй строке дано n чисел – элементы массива. Числа по модулю не превосходят \(10^9\). В третьей строке дано число q – кол-во запросов (\(1 <= q <= 10^5\)). Далее дано q строк, в каждой из которых дано 2 числа: l и r (\(1 <= l <= r <= n\)).

Выходные данные
Выведите ответы на все запросы, каждый в отдельной строке.
 

 

Примеры
Входные данные Выходные данные
1
5
1 2 3 4 5
3
1 2
3 3
2 5
3
3
14

time 1500 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w6471
Python102
Комментарий учителя