Я не буду просить, чтобы вы ее решили. Просто кажется интересным.
Пусть дан некоторый массив a размером N < 230 32-битных целых чисел. Требуется выполнить M запросов вида "сумма чисел на данном отрезке" за O(N+M), используя как можно меньше дополнительной памяти.
Очевидно, что существует решение, использующее 30 * N бит дополнительной памяти.
Update 1.
Если допускать сложность O(N+M*log(N)), то можно добиться 6 * N бит дополнительной памяти.
=============
В связи с особыми шаманствами, думаю, надо формализовать задачу немного по-другому.
Пусть дан некоторый массив a размером N из β-битных целых чисел. Требуется выполнить M запросов вида "сумма чисел на данном отрезке" за O(N+M), используя как можно меньше дополнительной памяти. Операция сложения и обращения по индексу выполняются за О(1), умножение процессор не поддерживает.
Очевидно, что существует решение, использующее бит дополнительной памяти.
Если допускать сложность O(N+M*log(N)), то можно добиться сколь угодно мало дополнительной памяти ценой сколь угодно большой константы во времени.
Ответ, конечно, надо выдать честно. Все 64 бита.
Запросы поступают по одному. Хранение запросов, полагаю, надо считать дополнительной памятью :)
Убрал в формализме все ограничения. Они и правда не нужны.
Вообще вопрос странный немного. Для времени работы установлено ассимптотическое ограничение, а для памяти кол-во бит. Что мешает посчитать частичные суммы блоков по L элементов, где L - константа? Памяти надо будет N/L*64, а время ассимптотически O(N+M). Понятно что если L близко к N то смысл вопроса теряется.
Для функции просеивания ответов получаем
Время
Память
Таким образом, дает сколь угодно мало памяти при сколь угодно большой константе во времени для случая . ОК, ясно.