Разбор
Каждый запрос можно выполнять при помощи цикла за время . Имеется запросов, длина массива составляет . При линейном времени выполнения запроса нам потребуется не более операций, что даст Time Limit.
Рассмотрим частичные суммы массива :
Вычислить значения можно в линейном массиве за время .
Далее заметим, что
Таким образом ответить на запрос можно за , то есть за константное время.
Пример
Вычислим сумму для приведенного в условии примера.
Имеем:
Реализация алгоритма
Объявим два рабочих двумерных массива.
#define MAX 1000001 int a[MAX], s[MAX];
Читаем входной набор чисел в массив , вычисляем частичные суммы в массиве .
scanf("%d",&n); s[0] = 0; for(i = 1; i <= n; i++) { scanf("%d",&a[i]); s[i] = s[i-1] + a[i]; }
Обрабатываем запросов.
scanf("%d",&m); for(i = 0; i < m; i++) { scanf("%d %d",&b,&c); printf("%d\n",s[c] - s[b-1]); }
Python реализация
Читаем входные данные.
n = int(input()) a = [0] + list(map(int, input().split()))
В списке вычисляем частичные суммы списка .
s = [0] * (n + 1) for i in range(1, n + 1): s[i] = s[i - 1] + a[i]
Обрабатываем запросов.
m = int(input()) for _ in range(m): b, c = map(int, input().split()) print(s[c] - s[b - 1])