Чемпионат по устному счету Имя входного файла: стандартный ввод
Имя выходного файла: стандартный вывод
Ограничение по времени: 1 секунда
Ограничение по памяти: 256 мегабайт
Председатель жюри чемпионата по устному счету Иван Михайлович Минусов придумал новое
задание для участников чемпионата. Исходно на доске выписывается n целых чисел: a1, a2, . . . , an.
После этого участник должен выполнять команды двух типов:
1. Стереть i-е число с доски и записать вместо него число x. То есть, если на доске
были записаны числа a1, a2, . . . , an, то после выполнения команды числа будут равны:
a1, . . . , ai−1, x, ai+1, . . . , an.
2. Циклически сдвинуть последовательность чисел на k вправо. То есть, если на доске
были записаны числа a1, a2, . . . , an, то после выполнения команды числа будут равны:
an−k+1, an−k+2, . . . , an, a1, a2, . . . , an−k.
После выполнения каждой команды участник должен вычислить сумму всех чисел, записанных
на доске, и сообщить ее жюри. Чтобы подготовиться проверять ответы участников, членам жюри
необходимо самим вычислить требуемые суммы.
Формат входных данных
В первой строке записано целое число n — количество чисел, изначально записанных на доске
(2 6 n 6 105
).
Во второй строке через пробел записаны n целых чисел: a1, a2, . . . , an — числа, изначально выписанные на доске — (−109 6 ai 6 109
).
В третьей строке записано целое число q — количество команд, которые необходимо выполнить
(1 6 q 6 105
).
В каждой из следующих q строк записана очередная команда в следующем формате:
• 1 i x — это означает, что что участник должен заменить i-е число последовательности на
число x (1 6 i 6 n; −109 6 x 6 109
).
• 2 k — это означает, что участник должен циклически сдвинуть последовательность чисел на
k вправо (1 6 k < n).
Формат выходных данных
В качестве ответа выведите q строк, в каждой из которых записано одно целое число.
В i-й строке должна быть записана сумма чисел на доске после выполнения первых i команд.
Обратите внимание, что ответ может быть достаточно большим и для его хранения потребуется
64-битный тип данных, int64 в паскале, long long в C++, long в Java.
Система оценки
за каждую подзадачу начисляются только в случае, если все тесты для этой подзадачи
и необходимых подзадач успешно пройдены.
Страница 1 из 2
Подзадача Дополнительные
ограничение
Необходимые
подзадачи
Информация о
проверке
1 20 2 6 n 6 1000, есть
только команды
первого типа
полная
2 20 2 6 n 6 1000, во всех
командах второго
типа k = 1
полная
3 40 2 6 n 6 1000 1, 2 полная
4 20 1 — 3 первая ошибка
Примеры
стандартный ввод стандартный вывод
6
4 1 2 1 5 3
5
2 3
1 3 10
1 4 4
2 1
1 1 -10
16
23
23
23
11
3
1000000000 1000000000 1000000000
3
1 2 999999999
2 2
1 2 999999999
2999999999
2999999999
2999999998
Замечание
Рассмотрим пример из условия. Изначально последовательность записанных на доске чисел равна: 4, 1, 2, 1, 5, 3.
После первой команды последовательность циклически сдвигается на 3 элемента вправо. Новая
последовательность: 1, 5, 3, 4, 1, 2. Сумма чисел равна: 1 + 5 + 3 + 4 + 1 + 2 = 16.
После второй команды необходимо заменить третий элемент последовательности на число 10.
Новая последовательность: 1, 5, 10, 4, 1, 2. Сумма чисел равна: 1 + 5 + 10 + 4 + 1 + 2 = 23.
После третьей команды заменить четвертый элемент на число 4. Так как четвертый элемент уже
равен 4, последовательность не изменяется. Сумма чисел также равна 23.
После четвертой команды последовательность циклически сдвигается на 1: 2, 1, 5, 10, 4, 1. Сумма
чисел не изменилась.
Наконец, после пятой команды последовательность становится равна: −10, 1, 5, 10, 4, 1. Сумма
чисел в итоговой последовательности равна −10 + 1 + 5 + 10 + 4 + 1 = 11.
Страница 2
Дерево Фенвика для массива A можно себе представлять так, как изображено на прикрепленном рисунке. В вершине, помеченной числом i, хранится сумма A[i] и всех элементов массива A с индексами, которые записаны в левом поддереве вершины i. Например, Fenwick[11] = A[8] + A[9] + A[10] + A[11]. Дерево Фенвика устроено так, чтобы в каждой вершине Fenwick[n] хранилась сумма отрезка массива от некоторого F(n) до n, нужно сообразить, чему равно F(n). F(n) получается, если идти по дереву в левые поддеревья, пока не наткнёмся на лист, он помечен чётным числом. Если двоичная запись числа n оканчивается на k единиц, то в F(n) эти k единиц заменены на нули.
Пусть нужно вычислить сумму префикса A[0..n], например, n = 9. Глядя на дерево, можно сообразить, что эта сумма равна (A[0] + A[1] + ... + A[7]) + (A[8] + A[9)) = Fenwick[7] + Fenwick[9]. В такой сумме обязательно есть Fenwick[n]: A[0] + A[1] + ... + A[n] = (A[0] + ... + A[F(n) - 1]) + (A[F(n)] + ... + A[n]) = (A[0] + ... + A[F(n) - 1]) + Fenwick[n]. Сумму в скобках тоже можно представить в виде суммы Fenwick[...].
Обновление значения A[n] приводит к обновлению некоторых Fenwick[k], а именно, Fenwick[n], и затем всех вершин-родителей, для которых текущая вершина является левым потомком. Например, чтобы обновить A[9], придется обновить Fenwick[9] и Fenwick[11]. Посчитано, что если текущая вершина имеет номер k, то следующая имеет номер k | (k + 1), и так далее, пока не кончатся вершины.
Высота дерева O(log n), так что операции нахождения суммы и обновления элементов работают за O(log n).
1. Для запуска программы, код которой был написан на компилируемом языке, на компьютере должен быть установлен компилятор этого языка.
Нет, если программа была откомпилирована на компьютере с процессором, имеющим такую же систему команд и в операционной системе (ОС), формат исполняемых программ которой, совместим с форматом для ОС данной машины.
2. Код программы, написанный на языке, который компилируется в машинный код, достаточно скомпилировать однажды, и потом программу можно будет запустить на любой операционной системе, для которой существует компилятор этого языка.
Да, если операционная система предназначена для процессоров с совместимой системой команд.
3. Для запуска программы, код которой был написан на интерпретируемом языке, на компьютере должен быть установлен интерпретатор этого языка.
Да.
4. Код программы, написанный на языке, который компилируется в байт код виртуальной машины, достаточно скомпилировать однажды, чтобы программу можно было запускать на любой операционной системе, где есть соответствующая виртуальная машина.
Да, именно так переносят между компьютерами так называемые portable приложения, в которых есть как компилируемый, так и интерпретируемый код.
5. Код программы, написанный на интерпретируемом языке, можно без предварительной компиляции запустить на любой операционной системе, где установлен интерпретатор этого языка.
Да, любой интерпретатор сам осуществляет, если это необходимо, компиляцию в байт-код.
6. Скомпилировать программу на C++ для некоторой архитектуры X можно только на компьютере с архитектурой X.
Нет, существуют так называемые кросс-платформенные компиляторы, позволяющие получать выполняемые коды для машин другой архитектуры. Кроме того, язык С++ является многоплатформенным; это позволяет компилировать написанные на нем программы на любой платформе, где имеется нужный компилятор. При написании кода нужно иметь в виду межплатформенные соглашения, например, нельзя использовать в программе обращания к библиотекам конкретной операционной системы.