Корневая декомпозиция




У нас есть задача, о том как быстро считать суммы на отрезке l...r в статичном массиве a за асимптотику меньшую, чем O(n).
Разделим массив a на k блоков одинакового размера и предварительно посчитаем для каждого из них сумму элементов.
Теперь, отвечая на запрос, можно пройтись по элементам массива a и прибавить их к результату, также если один из блоков лежит внутри отрезка, то мы можем прибавить его сумму к результату и пропустить элементы этого блока.
Максимальное количество операций на запрос при таком алгоритме равно n / k + k, следовательно оптимальное k равно квадратному корню из n.
 

Task
Time limit: 1000 ms,
Memory limit: 256 Mb

Дан массив a длины n (1 <= n <= 2 * 10^6, 1 <= ai <= 10^9). Также даны m (1 <= m <= 500) запросов вида l, r (1 <= l <= r <= n).
На каждый запрос нужно вывести сумму чисел на отрезке от l до r включительно.
Элементы нумеруются с 1 до n.

Ввод Вывод
4
1 2 3 4
2
1 4
1 1
10
1
5
5 5 5 5 5
1
5 5
5

(c) Брынских, А., 2018

Auto CHOOSE THE PROGRAMMING NECESSARY LANGUAGE!
Attach the program source file:
or enter the source code in the language:

Rules for designing programs and a list of errors during automatic task verification
           

Results: