| | | |
|
Суммы на подотрезках
Дерево отрезков, RSQ, RMQ
Реализуйте структуру данных для эффективного вычисления сумм подряд идущих элементов массива.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество чисел в массиве.
Во второй строке вводятся N чисел от 1 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число K (1 ≤ K ≤ 30000) — количество запросов на вычисление суммы.
В следующих K строках вводится по два числа — номера левого и правого элементов отрезка массива (считается, что элементы массива нумеруются с единицы).
Выходные данные
Для каждого запроса выведите сумму чисел соответствующего участка массива. Числа выводите в одну строку через пробел.
| Ввод |
Вывод |
5
4 4 8 7 8
2
1 2
1 3 |
8 16 |
| |
|
|
33701
Дерево отрезков, RSQ, RMQ
Реализуйте эффективную структуру данных, позволяющую изменять элементы массивы и вычислять НОД нескольких подряд идущих элементов.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала вводится одна буква, кодирующая вид запроса (s — вычислить НОД, u — обновить значение элемента).
Следом за s вводятся два числа — номера левой и правой границы отрезка.
Следом за u вводятся два числа — номер элемента и его новое значение.
Выходные данные
Для каждого запроса s выведите результат. Все числа выводите в одну строку через пробел.
| Ввод |
Вывод |
5
2 8 4 16 12
5
s 1 5
s 4 5
u 3 32
s 2 5
s 3 3 |
2 4 4 32 |
| |
|
|
Максимумы на подотрезках
Дерево отрезков, RSQ, RMQ
sqrt декомпозиция
Реализуйте структуру данных для эффективного вычисления максимумов подряд идущих элементов массива.
Входные данные
В первой строке вводится одно натуральное число N (\(1 <= N <= 100000\)) — количество чисел в массиве. Во второй строке вводятся N чисел от 1 до 100000 — элементы массива. В третьей строке вводится одно натуральное число K (\(1 <= K <= 30000\)) — количество запросов на вычисление максимума. В следующих K строках вводится по два числа — номера левого и правого элементов отрезка массива (считается, что элементы массива нумеруются с единицы).
Выходные данные
Для каждого запроса выведите значение максимального элемента на указанном отрезке массива. Числа выводите в одну строку через пробел.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
5
2 2 2 1 5
2
2 3
2 5 |
2 5 |
| |
|
|
Организация коров фермера Джона 2
Дерево отрезков, RSQ, RMQ
Из N коров выбирается делегация (1≤N≤2⋅105). Они стоят в ряд, корова i имеет породу bi.
Делегация будет состоять из непрерывного участка коров не менее трёх, то есть коровы l…r для целых l и r удовлетворяющих условиям 1≤l<r≤N и r−l≥2. Три коровы в выбранном интервале помечаются как лидеры делегации. Две граничные коровы обязательно должны быть лидерами. Кроме того, каждый лидер должен иметь породу отличную от всех остальных коров в делегации (лидеры или не лидеры).
Определите количество способов которыми можно выбрать делегацию. Две делегации рассматриваются различными, если у них отличаются члены или лидеры.
Входные данные:
Первая строка содержит N.
Вторая строка содержит N целых чисел b1,b2,…,bN, каждое в интервале [1,N].
Выходные данные:
Количество возможных делегаций на одной строке.
Примеры
| № |
Входные данные |
Выходные данные |
Пояснение |
| 1 |
7
1 2 3 4 3 2 5 |
9 |
Каждая делегация соответствует одному из следующих триплетов лидеров:
(1,2,3),(1,2,4),(1,3,4),(1,4,7),(2,3,4),(4,5,6),(4,5,7),(4,6,7),(5,6,7). |
| |
|
|
Взвешивание камней
Алгоритмы сортировки
Дерево отрезков, RSQ, RMQ
Жадный алгоритм
Джек нашел N камней и упорядочил их в порядке возрастания их массы. Массы всех камней различны. Самый легкий камень получил номер 1, следующий ≤ 2 и так далее, самый тяжелый получил номер N.
У Джека есть чашечные весы и он решил положить все камни на них в каком-то порядке. Известен порядок, в котором он будет класть камни, и какой камень на какую чашу попадет.
Ваша задача — определить состояние весов после добавления каждого камня. Точные массы камней не известны — даются только их номера.
Входные данные
Первая строка содержит целое число N (1 N ≤ 100000).
Каждая из следующих N строк содержит по два целых числа: R (1 ≤ R ≤ N) и S (1 ≤ S ≤ 2). R - номер камня, который будет положен на чашу S. Все R будут различны.
Выходные данные
Выведите N строк - по одной для каждого камня. Если после добавления соответствующего камня чаша 1 тяжелее, выведите “<”. Если сторона 2 тяжелее, выведите “>”. Если невозможно определить, в каком состоянии будут весы, выведите “?”.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
5
1 2
3 1
2 1
4 2
5 1 |
<
>
>
?
>
|
| |
|
|
Подстроки подпоследовательностей
Динамическое программирование: один параметр
Динамическое программирование
Дерево отрезков, RSQ, RMQ
Дерево Фенвика
Назовем подпоследовательностью массива a непустой массив b такой, что он может быть получен из массива a удалением нескольких (возможно, никаких) элементов массива a. Например, массив [1,3] является попоследовательностью массива [1,2,3] , но [3,1] не является.
Назовем подотрезком массива a непустой массив b такой, что он может быть получен путем удаления нескольких (возможно, никаких) первых и последних элементов массива a. Например, [1,2] является подотрезком массива [1,2,3] , а [1,3] не является. Несложно заметить, что у массива длины n ровно \( {n(n+1) \over 2}\) подотрезков.
Назовем массив a длины n возрастающим , если для любого 1 ≤ i ≤ n выполняется ai ≤ ai+1.
Монотонностью массива назовем количество его возрастающих подотрезков.
Дан массив a длины n. Посчитайте сумму монотонностей по всем его подпоследовательностям. Так как ответ может быть очень большим, выведите его по модулю 109+7.
Входные данные
В первой строке задано целое число n (1 ≤ n ≤ 200000) — длина массива a.
Во второй строке заданы n целых чисел (1 ≤ ai ≤ 200000) — элементы массива a.
Выходные данные
Выведите одно целое число — сумму монотонностей всех подпоследовательностей по модулю 109+7.
Примечание
В первом тестовом примере у массива есть 7 подпоследовательностей:
- У массива [1] есть ровно один подотрезок и он является возрастающим.
- У массива [2] есть ровно один подотрезок и он является возрастающим.
- У массива [3] есть ровно один подотрезок и он является возрастающим.
- У массива [1,2] есть три подотрезка ([1], [2], [1,2] ) и все они являются возрастающими.
- У массива [1,3] есть три подотрезка ([1], [3], [1,3] ) и все они являются возрастающими.
- У массива [3,2] есть три подотрезка ([3], [2], [3, 2] ), но только два из них ([3] и [2] ) являются возрастающими.
- У массива [1,3,2] есть шесть подотрезков ([1], [3], [2], [1,3], [3,2], [1,3,2] ) и четыре из них ([1], [3], [2], [1,3] ) являются возрастающими.
Во втором тестовом примере все возрастающие подотрезки всех подпоследовательностей имеют длину 1.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
3
1 3 2 |
15 |
| 2 |
3
6 6 6 |
12 |
| |
|
|
Путешествие по строке
Дерево отрезков, RSQ, RMQ
sqrt декомпозиция
Хеш
Суффиксный массив
Динамическое программирование
Хеш
Скажем, что последовательность строк t1 , ..., tk является путешествием длины k , если для всех i > 1 ti является подстрокой ti - 1 строго меньшей длины. Например, { ab , b } является путешествием, а { ab , c } или { a , a } — нет.
Определим путешествие по строке s как путешествие t1 , ..., tk , все строки которого могут быть вложены в s так, чтобы существовали (возможно, пустые) строки u1 , ..., uk + 1 , такие, что s = u1t1u2 t2 ... uk tk uk + 1 . К примеру, { ab , b } является путешествием по строке для abb , но не для bab , так как соответствующие подстроки расположены справа налево.
Назовём длиной путешествия количество строк, из которых оно состоит. Определите максимально возможную длину путешествия по заданной строке s .
Входные данные
В первой строке задано целое число n ( 1 ≤ n ≤ 500 000 ) — длина строки s .
Во второй строке содержится строка s , состоящая из n строчных английских букв.
Выходные данные
Выведите одно число — наибольшую длину путешествия по строке s .
Примечание
В первом примере путешествием по строке наибольшей длины является { abcd , bc , c } .
Во втором примере подходящим вариантом будет { bb , b } .
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
7
abcdbcc |
3 |
| 2 |
4
bbcb |
2 |
| |
|
|
Сокровища
meet in the middle
Дерево отрезков, RSQ, RMQ
Дочь короля Флатландии собирается выйти за прекрасного принца.
Принц хочет подарить принцессе сокровища, но он не уверен какие именно бриллианты из своей коллекции выбрать.
В коллекции принца n бриллиантов, каждый характеризуется весом wi и стоимостью vi.
Принц хочет подарить наиболее дорогие бриллианты, однако король умен и не примет бриллиантов суммарного веса больше R. С другой стороны, принц будет считать себя жадным всю оставшуюся жизнь, если подарит бриллиантов суммарным весом меньше L.
Помогите принцу выбрать набор бриллиантов наибольшей суммарной стоимости, чтобы суммарный вес был в отрезке [L, R].
Входные данные:
Первая строка содержит число n (1 <= n <= 32), L и R (0 <= L <= R <= 1018).
Следующие n строк описывают бриллианты и содержат по два числа - вес и стоимость соответствующего бриллианта (1 <= wi, vi <= 1015).
Выходные данные:
Первая строка вывода должна содержать k - количество бриллиантов, которые нужно подарить принцессе.
Вторая строка должна содержать номера даримых бриллиантов.
Бриллианты нумеруются от 1 до n в порядке появление во входных данных.
Если составить подарок принцессе невозможно, то выведите 0 в первой строке вывода.
Примеры:
| Входные данные |
Выходные данные |
3 6 8
3 10
7 3
8 2 |
1
2 |
| |
|
|
Сумма минимумов
Динамическое программирование
Дерево отрезков, RSQ, RMQ
Вам дан массив из n целых чисел. Вам необходимо разделить его на k непустых подотрезков (последовательность подряд идущих элементов) так, чтобы:
1) Каждый элемент массива входил ровно в один подотрезок.
2) Если для каждого подотрезка выбрать минимальное в нем число, то сумма всех минимумов должна быть максимально возможной.
Сообщите сумму минимумов значений в подотрезках этого разбиения.
Входные данные:
В первой строке дается два натуральных числа - n (1 <= n <= 500) и k (1 <= k <= n).
Во второй строке дается n целых чисел - элементы массива ai (1 <= ai <= 105).
Выходные данные:
Выведите одно число - ответ на задачу.
Пример:
| Входные данные |
Выходные данные |
5 3
4 2 5 1 3 |
8 |
Пояснение:
Одно из подходящих разбиений: [4, 2], [5], [1, 3]. Сумма минимумов в каждом подотрезке равна 2 + 5 + 1 = 8.
| |
|
|
Инверсии на отрезке
Алгоритм Мо
Дерево отрезков, RSQ, RMQ
Дана перестановка из n элементов.
Ответьте на m запросов про число инверсий для подотрезка перестановки от l до r.
Инверсией называется пара индексов i, j такая, что i < j и ai > aj, где ai - это i-й элемент перестановки.
Входные данные:
В первой строке задано число n (1 <= n <= 105).
Во второй строке задана перестановка из n элементов (элементы перестановки - попарно различные целые числа от 1 до n).
В третьей строке задано число m (1 <= m <= 105).
В последующих m строках содержится по два числа l и r - границы запроса (1 <= l, r <= n).
Выходные данные:
Выведите m строк - ответы на данные запросы.
Примеры:
| Входные данные |
Выходные данные |
5
4 5 2 3 1
3
1 3
3 5
1 5 |
2
2
8 |
6
5 2 4 3 1 6
3
4 6
2 5
1 5 |
1
4
8 |
| |
|
|
Урок физкультуры
Структуры данных
Дерево отрезков, RSQ, RMQ
Сканирующая прямая
Словари
Феоктист Всеволодович — преподаватель физкультуры старой закалки, глубоко убеждённый, что в начале каждого урока школьников необходимо построить по росту. Для этого он сначала просит школьников построиться самостоятельно, после чего последовательно меняет местами про- извольную пару стоящих рядом учеников, пока шеренга не примет желанный вид.
Всего на урок пришло N детей, изначально построившихся таким образом, что рост стоящего на позиции i равен hi (используется нумерация c 1). Можно считать, что все числа hi различны и лежат в диапазоне от 1 до N. Шеренга считается упорядоченной, если на первой позиции стоит школьник ростом один, на второй позиции стоит школьник ростом два и так далее.
Феоктист Всеволодович получает большое удовольствие от процесса упорядочивания школьни- ков, поэтому он всегда выбирает наиболее длинную последовательность обменов. С другой стороны, он не хочет чтобы ученики догадались о том, что он умышленно затягивает построение, поэтому никогда не делает заведомо бессмысленных обменов. А именно, преподаватель никогда не меняет местами школьников на позициях i и j, если hi < hj . Очевидно, что данное ограничение делает процесс сортировки шеренги по росту конечным.
Староста Саша очень любит играть в волейбол и прекрасно понимает, что чем дольше препо- даватель будет расставлять всех по местам, тем меньше времени останется для игры. Ученики уже построились некоторым образом, а Феоктист Всеволодович вышел поговорить по телефону, так что Саша может успеть поменять местами ровно двух школьников, необязательно стоящих рядом в ше- ренге. Разумеется, он хочет сделать это таким образом, чтобы преподаватель как можно быстрее закончил упорядочивать шеренгу (Саша давно уже раскусил, как именно действует Феоктист Всево- лодович). С информатикой у старосты всегда были определённые проблемы, поэтому ему требуется ваша помощь.
Формат входных данных
В первой строке ввода содержится единственное число N — количество школьников на уроке (1 <= N <= 1 000 000). Во второй строке записано N различных целых чисел hi (1 <= hi <= N). i-е число соответствует росту школьника стоящего на i-й позиции.
Формат выходных данных
Выведите два числа — номера позиций школьников, которым необходимо поменяться местами, чтобы минимизировать количество действий преподавателя. Если таких пар несколько, то выведите любую из них. Если никому меняться местами не нужно, выведите -1 -1.
| Ввод |
Вывод |
5
2 4 3 5 1 |
2 5 |
| 4 1 2 3 4 |
-1 -1 |
10
2 3 7 1 5 10 4 6 9 8 |
3 7 |
| |
|
|
Рассадка зверей
Дерево отрезков, RSQ, RMQ
НОД и алгоритм Евклида
НОД и алгоритм Евклида
НОД и алгоритм Евклида
Сегодня Колобок созвал всех волков и лис к себе в гости на чаепитие. Чаепитие пройдет за круглым столом, за которым всего n мест. Колобок хочет рассадить зверей по-особенному — так, чтобы волки не сидели только с волками, а лисы только с лисами. Поэтому для каждого места он записал одно целое число — сколько лис должно сидеть на расстоянии не более d от этого места, включая это место.
Два места находятся на расстоянии не более d, если между ними встречаются не более d−1 места при движении по или против часовой стрелки от одного к другому. Таким образом, для заданного места всего существует 2d + 1 место, находящееся на расстоянии не более d от него.
Теперь он хочет придумать какую-нибудь рассадку зверей, удовлетворяющую этим ограничениям.
Входные данные
В первой строке находятся два натуральных числа n, d (3 ≤ n ≤ 105 , 3 ≤ 2d+1 ≤ n) — количество мест за круглым столом и расстояние d. В следующей строке находятся n неотрицательных целых чисел ai (0 ≤ ai ≤ 2d+1) — количество лис на расстоянии не более d от этого места, включая это место. Информация о местах перечислена в порядке их следования по кругу.
Выходные данные
Если решения не существует, выведите «NO», иначе в первой строке выведите «YES», а в следу- ющей n чисел: 1 в том случае, если на этом месте сидит лиса, и 0, если на этом месте сидит волк. Если ответов несколько, разрешается вывести любой.
| Ввод |
Вывод |
5
1 2 2 1 2 2 |
YES
1 0 1 0 1 |
9
2 3 4 4 3 3 2 2 2 2 |
YES
1 0 1 1 1 0 0 0 1 |
6
1 3 3 3 3 3 1 |
NO |
| |
|
|
Switch Grass
Минимальный каркас
Структуры данных
Дерево отрезков, RSQ, RMQ
Обход в глубину
Алгоритмы на графах
Фермер Джон обнаружил, что разные типы коров любят разные типы травы. Однако он должен правильно их высаживать, чтобы не навредить.
Ферма Джона состоит из NN (1≤N≤200,000), полей, и MM пар полей соединены двунаправленными дорожками (1≤M≤200,000). Используя эти дорожки, можно пройти от любого поля к любому другому полю. Каждая дорожка имеет целочисленную длину в интервале 1…1,000,000. Любая пара полей соединена не более чем одной прямой дорожкой.
В каждом поле ФД изначально посадил один из KK типов травы (1≤K≤N). Через некоторое время, однако, он может решить изменить тип травы на некоторых из полей. Он называет это операцией "обновления".
После каждого обновления, ФД хочет знать длину кратчайшего пути между двумя полями, имеющими различные типы травы. То есть, среди всех пар полей, имеющих различные типы травы, он хочет узнать, какие два поля ближайшие друг к другу. Гарантируется, что всегда имеется как минимум одна пара полей с различными типами травы.
В 30 процентах тестов каждое поле непосредственно соединено не более чем с 10 дорожками.
ФОРМАТ ВВОДА:
Первая строка ввода содержит четыре целых числа N, M, K, Q, где Q - количество операций обновления (1≤Q≤200,000). Следующие M строк описывают дорожки. Каждая строка содержит три целых числа A, B, L, указывающих, что есть дорожка между полями A, B и её длина L. (A, B - целые числа в интервале 1…N). Следующая строка указывает начальный тип травы для каждого поля (N целых чисел в интервале 1…K). Затем идут Q строк, каждая из которых описывает одну операцию обновления двумя целыми числами A и B, означающими, что на поле A типе травы изменён на B.
ФОРМАТ ВЫВОДА:
Для каждой операции обновления выведите длину кратчайшего пути между двумя полями с различными типами травы, после применения этой операции обновления.
| Ввод |
Вывод |
|
3 2 3 4
1 2 3
2 3 1
1 1 2
3 3
2 3
1 2
2 2
|
1
3
3
1
|
| |
|
|
Trapped in the Haybales
Динамическое программирование: один параметр
Динамическое программирование
Дерево отрезков, RSQ, RMQ
Структуры данных
Фермер Джон получили груз из N больших стогов сена (1≤N≤100,000), и разметил их в различных положениях вдоль дороги, ведущей к амбару. К несчастью, он полностью забыл, что корова Беси пасётся вдоль дороги и может попасть в ловушку между стогами сена.
Каждый стог j имеет размер Sj и позицию Pj определяющую его положение вдоль дороги. Беси может двигаться вдоль дороги вплоть до позиции стога, но не может пересечь эту позицию. Исключение – если она прошла в этом направлении D единиц расстояния, тогда она набрала достаточно скорости, чтобы протаранить стог любого размера строго меньше чем D. Конечно после этого она может продолжить движение и таранить другие стога.
Беси может выйти на свободу если она в конце концов протаранит протаранит самый левый или самый правый стог. Вычислите общий размер участка дороги, состоящий из возможных точек старта Беси, из которых она не сможет выбраться.
ФОРМАТ ВООДА:
Первая строка ввода содержит N. Каждая из последующих N строк описывает стог, и содержит два целых числа определяющих размер и позицию в диапазоне 1…109. Все позиции различны.
ФОРМАТ ВЫВОДА:
Выведите одно целое число – размер области дороги, откуда Беси не сможет выбраться.
| Ввод |
Вывод |
|
5
8 1
1 4
8 8
7 15
4 20
|
14 |
| |
|
|
Load Balancing
Дерево Фенвика
Дерево отрезков, RSQ, RMQ
Структуры данных
Тернарный поиск
Коровы Фермера Джона стоят в различных точках (x1,y1)…(xn,yn) его поля (1≤N≤100,000, все xi и yi - положительные нечётные целые числа, не превышающие 1,000,000. ФД хочет разделить своё поле изгородью бесконечной длины с севера на юг, описываемой уравнением x=a (a - чётное целое, так обеспечивается, что изгородь не пройдёт через позицию ни одной коровы). Также он хочет построить изгородь бесконечной длины с востока на запад, которая описывается уравнением y=b, где b - чётное целое. Эти две изгороди пересекаются в точке (a,b), и вместе делят поле на четыре региона.
ФД хочет выбрать a и b так, чтобы получить "сбалансированное" количество коров во всех регионах, т.е. чтобы не было региона, который содержит слишком много коров. Пусть M - максимальное количество коров в этих четырёх регионах, ФД хочет, чтобы M было как можно меньше. Помогите ФД определить это минимально возможное значение для M.
ФОРМАТ ВВОДА:
Первая строка ввода содержит одно целое число, N. Каждая из следующих n строк содержит местоположение одной коровы, указанное её координатами x и y.
ФОРМАТ ВЫВОДА:
Выведите минимально возможное значение M, которое может достичь ФД оптимальным расположением изгородей.
| Ввод |
Вывод |
|
7
7 3
5 5
7 13
3 1
11 7
5 3
9 1
|
2 |
| |
|
|
Башни 3.0
Структуры данных
Дерево отрезков, RSQ, RMQ
Дерево отрезков, RSQ, RMQ
В компьютерной игре есть n башен, высота i-й башни равна ai метров. Определим расстояние между двумя башнями с индексами i и j как |i−j|. Разрешается прыгнуть с i-й башни на j-ю башню тогда и только тогда, когда не существует такого индекса 1 <= k <= n, такого, что расстояние от i-й до j-й башни не меньше расстояния от i-й башни до k-й башни, и k-я башня имеет большую высоту, чем j-я. Башня j достижима из башни i если существует последовательность корректных прыжков, которая начинается в i-й башне и заканчивается в j-й.
Вам даны q запросов вида (u,v,l,r). Для каждого запроса посчитайте количество индексов l <= k <= r, таких, что k-я башня достижима из u-й башни и из v-й башни. Обратите внимание, что во многих подзадачах выполняется ограничение u=v, l=1, r=n, то есть ответом на запрос будет общее число башен, достижимых из u .
Входные данные
Первая строка входных данных содержит одно целое число n (1 <= n <= 500000) - количество башен.
Вторая строка входных данных содержит n чисел a1, a2, ..., an (1 <= an <= 109) - высоты башен.
Третья строка входных данных содержит одно целое число q (1 <= q <= 500000) - количество запросов.
Следующие q строк описывают запросы. i-я из них описывает i-й запрос и содержит четыре целых числа ui, vi, li, ri (1<= ui, vi <= n, 1 <= li <= ri <= n) - индексы вершин запроса и границы отрезка запроса.
Выходные данные
Выведите n чисел, i-е из которых должно быть равным ответу на i-й запрос.
Примечание
В первых двух примерах запросы спрашивают количество достижимых из каждой башни башен.
В первом примере с 1-й башни можно прыгнуть на башни 1 и 5. Любая другая башня имеет меньшую высоту, чем башня 1, поэтому туда нельзя прыгнуть (в качестве k можно выбрать 1). Множество достижимых из 1-й башни также состоит из башен 1 и 5. Со второй башни можно прыгнуть на башни 1, 2, и 5, они же являются множеством достижимых. С третьей башни можно прыгнуть на башни 2, 3, 5. Однако, башня 1 также является достижимой, поскольку можно сделать два прыжка: 3→2→1. Таким образом, получается 4 достижимые башни. С 4-й башни можно прыгнуть на башни 4 и 5, они же являются единственными достижимыми. Из 5-й башни достижима только она сама.
Во втором примере из 1-й и из 2-й башни достижимы башни 1,2,3,4,5. Из 3-й башни достижимы башни 3,4,5. Из 4-й и 5-й башни достижимы башни 4,5. Из 6-й башни достижимы башни 4,5,6. Из 7-й башни достижимы башни 4,5,6,7.
Рассмотрим третий пример:
- В первом запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {3,6}.
- Во втором запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {6}.
- В третьем запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {3}.
- В четвёртом запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v пусто.
- В пятом запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {6}.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
5
7 6 3 4 10
5
1 1 1 5
2 2 1 5
3 3 1 5
4 4 1 5
5 5 1 5
|
2
3
4
2
1
|
| 2 |
7
1 1 1 2 2 1 1
7
1 1 1 7
2 2 1 7
3 3 1 7
4 4 1 7
5 5 1 7
6 6 1 7
7 7 1 7
|
5
5
3
2
2
3
4
|
| 3 |
7
6 8 9 3 5 10 1
5
1 3 2 7
4 5 1 6
1 4 2 4
4 7 1 3
1 5 3 6
|
2
1
1
0
1
|
| |
|
|
Башни 3.0
Структуры данных
Дерево отрезков, RSQ, RMQ
Дерево отрезков, RSQ, RMQ
В компьютерной игре есть n башен, высота i-й башни равна ai метров. Определим расстояние между двумя башнями с индексами i и j как |i−j|. Разрешается прыгнуть с i-й башни на j-ю башню тогда и только тогда, когда не существует такого индекса 1 <= k <= n, такого, что расстояние от i-й до j-й башни не меньше расстояния от i-й башни до k-й башни, и k-я башня имеет большую высоту, чем j-я. Башня j достижима из башни i если существует последовательность корректных прыжков, которая начинается в i-й башне и заканчивается в j-й.
Вам даны q запросов вида (u,v,l,r). Для каждого запроса посчитайте количество индексов l <= k <= r, таких, что k-я башня достижима из u-й башни и из v-й башни. Обратите внимание, что во многих подзадачах выполняется ограничение u=v, l=1, r=n, то есть ответом на запрос будет общее число башен, достижимых из u .
Входные данные
Первая строка входных данных содержит одно целое число n (1 <= n <= 500000) - количество башен.
Вторая строка входных данных содержит n чисел a1, a2, ..., an (1 <= an <= 109) - высоты башен.
Третья строка входных данных содержит одно целое число q (1 <= q <= 500000) - количество запросов.
Следующие q строк описывают запросы. i-я из них описывает i-й запрос и содержит четыре целых числа ui, vi, li, ri (1<= ui, vi <= n, 1 <= li <= ri <= n) - индексы вершин запроса и границы отрезка запроса.
Выходные данные
Выведите n чисел, i-е из которых должно быть равным ответу на i-й запрос.
Примечание
В первых двух примерах запросы спрашивают количество достижимых из каждой башни башен.
В первом примере с 1-й башни можно прыгнуть на башни 1 и 5. Любая другая башня имеет меньшую высоту, чем башня 1, поэтому туда нельзя прыгнуть (в качестве k можно выбрать 1). Множество достижимых из 1-й башни также состоит из башен 1 и 5. Со второй башни можно прыгнуть на башни 1, 2, и 5, они же являются множеством достижимых. С третьей башни можно прыгнуть на башни 2, 3, 5. Однако, башня 1 также является достижимой, поскольку можно сделать два прыжка: 3→2→1. Таким образом, получается 4 достижимые башни. С 4-й башни можно прыгнуть на башни 4 и 5, они же являются единственными достижимыми. Из 5-й башни достижима только она сама.
Во втором примере из 1-й и из 2-й башни достижимы башни 1,2,3,4,5. Из 3-й башни достижимы башни 3,4,5. Из 4-й и 5-й башни достижимы башни 4,5. Из 6-й башни достижимы башни 4,5,6. Из 7-й башни достижимы башни 4,5,6,7.
Рассмотрим третий пример:
- В первом запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {3,6}.
- Во втором запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {6}.
- В третьем запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {3}.
- В четвёртом запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v пусто.
- В пятом запросе множество индексов башен k на отрезке [l,r], достижимых из u и из v — {6}.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
5
7 6 3 4 10
5
1 1 1 5
2 2 1 5
3 3 1 5
4 4 1 5
5 5 1 5
|
2
3
4
2
1
|
| 2 |
7
1 1 1 2 2 1 1
7
1 1 1 7
2 2 1 7
3 3 1 7
4 4 1 7
5 5 1 7
6 6 1 7
7 7 1 7
|
5
5
3
2
2
3
4
|
| 3 |
7
6 8 9 3 5 10 1
5
1 3 2 7
4 5 1 6
1 4 2 4
4 7 1 3
1 5 3 6
|
2
1
1
0
1
|
| |
|
|
Индекс максимума на подотрезках
Дерево отрезков, RSQ, RMQ
Реализуйте структуру данных для эффективного вычисления номера максимального из нескольких подряд идущих элементов массива.
Входные данные
В первой строке вводится одно натуральное число N (\(1 <= N <= 100000\)) — количество чисел в массиве.
Во второй строке вводятся N чисел от 1 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число K (\(1 <= K <= 30000\)) — количество запросов на вычисление максимума.
В следующих K строках вводится по два числа — номера левого и правого элементов отрезка массива (считается, что элементы массива нумеруются с единицы).
Выходные данные
Для каждого запроса выведите индекс максимального элемента на указанном отрезке массива. Если максимальных элементов несколько, выведите любой их них.
Числа выводите в одну строку через пробел.
| |
|
|
Терминал
Дерево отрезков, RSQ, RMQ
Специальный терминал, разработанный в лаборатории, где работает Дима, представляет собой горизонтальный прямоугольник, состоящий из m×n ячеек, каждая из которых может содержать произвольное целое число. Ячейки занумерованы парами чисел, левая верхняя ячейка имеет номер (1, 1), правая нижняя – (m, n).
Специальное устройство ввода, сконструированное специально для этого терминала, позволяет отправлять терминалу две команды: A(r, c, d, v) и B(r1, c1, r2, c2, d, v).
Рассмотрим сначала команду A. Параметры r и c изменяются в пределах от 1 до m и от 1 до n соответственно и указывают, к какой ячейке применяется команда. Параметр d может принимать значение из множества {L, R, U, D} и задает направление, в котором применяется команда: влево, вправо, вверх или вниз соответственно. Параметр v представляет собой целое неотрицательное число. В результате выполнения команды значения во всех ячейках, находящихся в направлении d от ячейки (r, c), включая эту ячейку, увеличиваются на v.
Например, если терминал имеет размер 5×4, то после выполнения команды A(3, 2, R, 3) значения в ячейках (3, 2),(3,3) и (3, 4) увеличатся на 3, а после команды A(2, 1, U, 2) значения в ячейках (2, 1) и (1, 1) увеличатся на 2.
Рассмотрим теперь команду B. Первые четыре ее параметра являются целыми числами и удовлетворяют условиям 1≤ r1 ≤ r2 ≤ m и 1≤ c1 ≤ c2 ≤ n. Параметры d и v могут принимать те же значения, что и соответствующие параметры команды A. Команда B выполняется следующим образом: для всех пар (r, c), таких, что r1 ≤ r ≤ r2 и c1 ≤ c ≤ c2 выполняется команда A(r, c, d, v).
Исходно все ячейки терминала содержат нули. Выведите содержимое терминала после выполнения заданной последовательности команд.
Входные данные
В первой строке вводятся числа m и n, ( 1≤m, n≤200). В следующей строке задается число k – количество команд, которые следует обработать ( 0≤k≤40 000). Далее идут k строк, содержащих описания команд. Первый символ каждой строки задает тип команды, затем следует пробел и параметры команды, каждые два последовательных параметра разделены ровно одним пробелом. Параметр v каждой команды неотрицателен и не превышает 100.
Общее число команд A, которое потребуется выполнить на терминале, включая команды, которые придется выполнить при выполнении команд B, не превышает 5 * 106.
Выходные данные
Выведите m строк по n чисел в каждой – содержимое терминала после выполнения указанной последовательности команд.
| |
|
|
Пирамида
Дерево отрезков, RSQ, RMQ
После победы в великой битве Король Ягуар хочет построить пирамиду, которая будет одновременно монументом в честь победы и гробницей для погибших солдат. Пирамида будет построена на поле боя. Она должна иметь прямоугольное основание, состоящее из a столбцов и b строк. Для сохранения останков и оружия павших солдат внутри основания пирамиды будет располагаться небольшая прямоугольная комната, состоящая из c столбцов и d строк.
Архитекторы Короля представили поле боя в виде прямоугольной сетки. Эта сетка состоит из квадратных клеток единичной площади и имеет m столбцов и n строк. Для каждой клетки они измерили ее высоту и получили некоторое целое число.
Основание пирамиды и комната должны покрывать включаемые ими клетки полностью, а их стороны должны быть параллельны сторонам поля боя. Высоты клеток, составляющих комнату, должны остаться неизменными, а высоты всех клеток основания пирамиды будут выровнены с помощью перемещения песка с более высоких клеток на более низкие. В результате этого высота основания пирамиды будет равна среднему арифметическому высот всех его клеток (за исключением клеток комнаты). Архитекторы могут выбрать любое местоположение для комнаты внутри пирамиды, но обязательно оставлять вокруг комнаты стену основания пирамиды толщиной хотя бы в одну клетку.
Помогите архитекторам выбрать наилучшее место для расположения пирамиды и комнаты внутри нее так, чтобы высота основания пирамиды была максимально возможной при заданных размерах. На рисунке показан пример поля боя, где число в каждой клетке обозначает ее высоту. Клетки, составляющие основание пирамиды, обозначены серым цветом, а белые клетки внутри основания пирамиды соответствуют расположению комнаты. На этом рисунке представлен пример оптимального решения.

Задание
Напишите программу, которая по заданным размерам поля боя, пирамиды и комнаты, а также по заданным высотам всех клеток будет находить такое расположение пирамиды и комнаты внутри нее, что получившаяся высота основания пирамиды будет максимально возможной.
Ограничения
3 ≤ m ≤ 1000
3 ≤ n ≤ 1000
3 ≤ a ≤ m
3 ≤ b ≤ n
1 ≤ c ≤ a – 2
1 ≤ d ≤ b – 2
Все высоты – целые числа от 1 до 100.
Входные данные
Ваша программа получает входные данные в следующем формате:
СТРОКА 1: Содержит шесть целых чисел, разделенных пробелами, в следующем порядке: m, n, a, b, c и d.
СЛЕДУЮЩИЕ n СТРОК: Каждая из этих строк содержит m целых чисел, разделенных пробелами. Эти числа соответствуют высотам клеток в одной строке сетки. Первая из этих строк соответствует верхней строке (строке 1) сетки, а последняя – нижней строке (строке n). При этом m чисел в каждой строке соответствуют высотам клеток этой строки, начиная со столбца 1.
Выходные данные
Ваша программа должна вывести следующие данные:
СТРОКА 1: Должна содержать два целых числа, разделенные пробелом, – координаты левой верхней клетки основания пирамиды, при этом первое число соответствует столбцу, а второе – строке.
СТРОКА 2: Должна содержать два целых числа, разделенные пробелом, – координаты левой верхней клетки комнаты, при этом первое число соответствует столбцу, а второе – строке.
Замечание
Если существует несколько оптимальных положений пирамиды и комнаты, выведите любое из них.
| |
|
|
Горы
Дерево отрезков, RSQ, RMQ
В Горном Парке Развлечений открылся новый аттракцион с американскими горками. Трек в аттракционе состоит из n рельсов, соединенных последовательно друг с другом, причем первый рельс начинается на высоте 0. Оператор Байтмэн может изменять конфигурацию трека по своему усмотрению, корректируя наклон некоторых последовательно соединенных рельсов. Наклон остальных рельсов при этом не изменяется. Всякий раз, когда наклон некоторых рельсов изменяется, все следующие за ними рельсы соответственно поднимаются или опускаются. При этом высота начала трека всегда остается равной 0.
На рисунках представлены изменения конфигурации трека в соответствии со входными данными, заданными в примере:

Каждый заезд начинается с того, что кабина запускается из начала трека с энергией, достаточной для достижения высоты h. Иными словами, кабина будет продолжать движение по рельсам, пока ее высота не превысит h или пока она не достигнет конца трека. Вычислите по записям о всех заездах и изменениях конфигураций трека число рельсов, которые были полностью пройдены кабиной в каждом из заездов до ее остановки.
В аттракционе трек описывается последовательностью из n наклонов, по одному для каждого рельса. i -е число d равно разнице высот (в сантиметрах) между концом i -го рельса и его началом. Иными словами, если после прохождения по первым i − 1 рельсам кабина оказывается на высоте h сантиметров, то после прохождения по i рельсам она будет на высоте h + di сантиметров. Изначально все рельсы горизонтальны, то есть di = 0 для всех i. Заезды и изменения конфигурации происходят в течение дня. Каждое изменение конфигурации описывается тремя числами: a, b
и D. Такое изменение затрагивает рельсы с a -го по b -й (включительно). Наклон каждого из этих рельсов устанавливается равным D. Иными словами, di = D для всех a <= i <= b. Каждый заезд задается одним числом h – максимальной высотой, на которую может подняться кабина.
Задание
Напишите программу, которая:
• читает из стандартного ввода последовательность описаний изменений конфигурации трека и заездов,
• для каждого заезда вычисляет количество рельсов, которые пройдены кабиной,
• выводит результаты в стандартный вывод.
Входные данные
Первая строка входных данных содержит одно положительное целое число n – количество рельсов в треке, 1 <= n
<= 1000000000 . Последующие строки содержат описания изменений конфигурации и заездов. Последняя строка входных данных содержит признак окончания. Каждая строка, начиная со второй, может содержать:
• Описание изменения конфигурации трека – один символ ‘I’ и целые числа a , b и D, разделенные одним пробелом (1 <= a <= b <= n , − 1000000000 <= D <= 1000000000).
• Описание заезда – один символ ‘Q’ и целое число h ( 0 <= h <= 1000000000 ), разделенные одним пробелом.
• Один символ “E” – признак окончания входных данных.
Вы можете предполагать, что в каждый момент высота любой точки трека содержится в промежутке [0 , 1000000000] . Входные данные содержат не более 100000 строк.
Выходные данные
i-я строка выходных данных должна содержать единственное целое число – количество рельсов, которые пройдены кабиной в i-м заезде.
| |
|
|
Берляндия атакует
Наименьший общий предок
Дерево отрезков, RSQ, RMQ
Разреженные таблицы (sparse table)
В этой задаче Вам вновь придется помочь Берляндии. Эта страна состоит из n городов, некоторые пары из которых соединены двусторонними дорогами, каждая дорога характеризуется своей длиной. Все города пронумерованы числами от 1 до n, столица имеет номер 1. Время от време ни Президент объезжает страну, посещая города страны. Целью каждой поездки является один из городов, к которому он едет из столицы вдоль дорог одним из кратчайших путей.
В далекие времена (когда задачи на алгоритм Дейкстры вызывали сложность) специальное ведомство составила такой набор дорог T, вдоль которого можно было проехать из столицы в любой город, причем единственным образом. Разумеется, путь по дорогам из набора T из столицы в каждый город являлся кратчайшим. Особо умные жители страны попросту называли этот набор дорог "деревом кратчайших путей". Известно, что Президент пользовался дорогами из T во время своих поездок. За прошедшие годы этот набор перестал быть секретным, и, поэтому, стал объектом повышенного внимания берляндских экстремистов. У специального ведомства новое задание. Для каждого города кроме столицы необходимо вычислить кратчайшее расстояние до него, при условии, что та дорога по которой Президент должен был закончить свой путь в этот город является атакованной и проезжать по ней нельзя.
Входные данные
В первой строке входного файла записана пара целых чисел n и m (2 ≤ n≤ 4000; n−1 ≤ m ≤100000), где n — количество городов в стране, а m— количество дорог в этой стране. Далее в m строках содержатся описания дорог, по одной дороге в строке. Каждая дорога задается четверкой целых чисел aj, bj, lj, tj , где aj, bj это номера городов, соединяемых дорогой (1 ≤ aj,bj ≤ n; aj≠bj), lj — ее длина (1 ≤ lj≤ 105), а tj равно 1 если дорога принадлежит дереву кратчайших путей и 0 в противном случае.
Гарантируется, что набор T удовлетворяет описанным выше свойствам. Между парой городов может быть более одной дороги. Все дороги двусторонние.
Выходные данные
Выведите n−1 число в строку через пробелы. i-ое число должно быть равно либо длине кратчайшго пути из столицы в город i+1, при условии, что по той дороге из T, которой Президент заканчивал свой путь в этот город, передвигаться нельзя, либо -1, если добраться до города i+1 вообще невозможно.
| |
|
|
RMQ
Дерево отрезков, RSQ, RMQ
Реализуйте структуру данных, которая на данном массиве из N целых чисел позволяет узнать максимальное значение на этом массиве и индекс элемента, на котором достигается это максимальное значение.
Входные данные
В первой строке вводится натуральное число N (1 ≤ N ≤ 105) – количество элементов в массиве. В следующей строке содержатся N целых чисел, не превосходящих по модулю 109 – элементы массива. Далее идет число K (0 ≤ K ≤ 105) – количество запросов к структуре данных. Каждая из следующих K строк содержит два целых числа l и r (1 ≤ l ≤ r ≤ N) – левую и правую границы отрезка в массиве для данного запроса.
Выходные данные
Для каждого из запросов выведите два числа: наибольшее значение среди элементов массива на отрезке от l до r и индекс одного из элементов массива, принадлежащий отрезку от l до r, на котором достигается этот максимум.
| |
|
|
Непересекающиеся отрезки
Дерево отрезков, RSQ, RMQ
Отрезок целочисленной прямой длины N разбит на единичные отрезки, которые пронумерованы от 1 до N.
Их объединяют в группы по следующим правилам:
1. Несколько подряд идущих отрезков, ни один из которых не принадлежит ни одной из групп, могут быть объединены в группу.
2. Любая ранее созданная группа может быть уничтожена, при этом входившие в нее отрезки больше не относятся ни к какой группе и могут впоследствии быть отнесены к другим группам.
Видно, что любой отрезок всегда находится не более, чем в одной группе.
Каждую группу можно идентифицировать парой чисел: номером первого и номером последнего отрезка, входящего в группу.
Первоначально нет ни одной группы.
Входные данные
Первая строка входных данных содержит число N – количество отрезков и число K – количество запросов (1 ≤ N, K ≤105). Далее идет K строчек, содержащих запросы к структуре данных. Каждый запрос начинается с числа 1 (запрос на создание группы) или 2 (запрос на удаление группы). После числа 1 указывается два других числа l и r (1 ≤ l ≤ r ≤ N), после числа 2 указывается одно число i (1 ≤ i ≤ N).
Выходные данные
Для каждого запроса типа 1 необходимо отрезки с номерами от l до r объединить в группу. Если все эти отрезки не входят ни в одну группу, запрос считается удачным и программа должна вывести 1. Если хотя бы один из этих отрезков уже относится к какой-то группе, запрос считается неудачным, объединение не производится и программа выводит 0.
Для каждого запроса типа 2 необходимо удалить группу, в которую входит отрезок с номером i, при этом программа должна вывести два числа: номер первого и последнего отрезка, входящих в удаляемую группу. Если отрезок с номером i не относится ни к одной группе, программа должна вывести два нуля.
| |
|
|
Хипуй!
Дерево отрезков, RSQ, RMQ
Куча
В этой задаче вам необходимо организовать структуру данных Heap для хранения целых чисел, над которой определены следующие операции:
a) Insert(k) – добавить в Heap число k (1 ≤ k ≤ 1000000) ;
b) Extract достать из Heap наибольшее число (удалив его при этом).
Входные данные
В первой строке содержится количество команд N (1 ≤ N ≤ 100000), далее следуют N команд, каждая в своей строке. Команда может иметь формат: “0 <число>” или “1”, обозначающий, соответственно, операции Insert(<число>) и Extract. Гарантируется, что при выполенении команды Extract в структуре находится по крайней мере один элемент.
Выходные данные
Для каждой команды извлечения необходимо отдельной строкой вывести число, полученное при выполнении команды Extract.
| |
|
|
Минимум на отрезке
Дерево отрезков, RSQ, RMQ
Дек
Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается “окно” длины K, то есть сначала в “окне” видно первые K чисел, на следующем шаге в “окне” уже будут находиться K чисел, начиная со второго, и так далее до конца последовательности. Требуется для каждого положения “окна” определить минимум в нём.
Входные данные
В первой строке входных данных содержатся два числа N и K (1 ≤ N ≤ 150000, 1 ≤ K ≤ 10000, K ≤ N) – длины последовательности и “окна”, соответственно. На следующей строке находятся N чисел – сама последовательность.
Выходные данные
Выходые данные должны содержать N − K + 1 строк – минимумы для каждого положения “окна”.
| |
|
|
Контроль доступа
Бор
Дерево отрезков, RSQ, RMQ
Вася разрабатывает новый веб-сервер. В настоящее время он работает над функцией, осебспечивающей поддержку списков контроля доступа. Список контроля доступа позволяет ограничить доступ к некоторым ресурсам веб-сайта, основываяь на основании IP-адреса запрашивающей стороны.
Каждый IP-адрес − это 4-байтный номер, который записан байт за байтом в десятичной записи. Байты разделены точками следующим образом: <<byte0.byte1.byte2.byte3>> (кавычки добавлены для ясности). Каждый байт записывается как десятичное число от 0 до 255 (включительно) без ведущих нулей. IP-адреса организованы в IP-сети. IP сети описывается двумя 4-байтовыми числами - сетевым адресом и маской сети. И сетевой адрес и маска сети записаны в той же форме, что и IP-адреса. Для того чтобы понять смысл сетевого адреса и маски сети рассмотрим их двоичное представление. Двоичное представление IP адреса, сетевого адреса и маски сети состоит из 32 бит: 8 бит для byte0 (от старших к младшим), затем по 8 бит для byte1, 8 бит для byte2 и 8 бит для byte3.
IP сеть содержит 2N IP-адресов, где 0≤N≤32. В маске сети первые 32–N бита установлены в единицы, и последние N бит установлены в ноль. Сетевой адрес имеет произвольные 32–N первых бит, а последние N бит установлен в ноль. IP сеть содержит все IP-адреса, первые 32−N бит которых равны 32–N
первых бит сетевого адреса с произвольными N последними битами. Например, IP сеть с сетевым адресом 194.85.160.176 и сетевая маска 255.255.255.248 содержит 8 IP-адресов, с 194.85.160.176 по 194.85.160.183 (включительно).
IP сети, как правило, обозначается как <<byte0.byte1.byte2.byte3/S>>, где <<byte0.byte1.byte2.byte3>> − сетевой адрес, S − это число бит, установленных в единицу в маске сети. Например, IP сети из предыдущего абзаца обозначается как 194.85.160.176/29. Список контроля доступа содержит упорядоченный список правил. Каждое правило имеет одну из следующих форм:
deny from <IP network> − запрещает доступ к ресурсу для любого IP из заданной сети.
deny from <IP address> − запрещает доступ к ресурсу для указанного IP-адреса.
allow from <IP network> − разрешает доступ к ресурсу для любого IP из заданной сети.
allow from <IP address> − разрешает доступ к ресурсу для указанного IP-адреса.
Когда кто-нибудь обращается к какому-либо ресурсу, первым делом проверяется IP-адрес обращающегося по списку контроля доступа. Правила проверяются в том порядке, в котором они перечислены, и применяется первое выполняющееся правило. Если ни одно из правил не соответствует IP-адресу запрашивающей стороны, то доступ предоставляется.
По известному списку контроля доступа и списку запросов от IP-адресов, необходимо выяснить для каждого из запросов будет ли предоставлен доступ к ресурсу.
Входные данные
Первая строка ввода содержит число N − количество правил в списке контроля доступа (0≤N≤100000). Следующие N строк содержат правила по одному в строке. IP сеть всегда записывается как <<byte0.byte1.byte2.byte3/S>>. Следующая строка содержит число M − количество IP адресов, которые следует проверить (0≤M≤100000). Следующие M строк содержат по одному IP адресу в строке.
Выходные данные
Для каждого из M IP-адресов выведите <<A>>, если доступ будет предоставлен, и <<D>> иначе. Все символы следует выводить слитно, не разделяя пробелами.
| |
|
|
Информационный стенд
Дерево отрезков, RSQ, RMQ
sqrt декомпозиция
В холле 179 школы, есть информационный стенд размером H×W (H – высота, W – ширина). На этом стенде размещается информация о кружках, изменениях в расписании, победах в олимпиадах, а также другая важная информация.
Первого сентября стенд был пуст. Одно за другим на нем начали появляться объявления, которые потом не снимались.
Каждое объявление представляет собой полоску бумаги единичной высоты. I-ое объявление представляет собой прямоугольник размером 1×Wi.
Когда кто-либо вешает объявление на стенд, то он старается повесить объявление как можно выше. Среди возможных верхних мест всегда выбирается самое левое. Если подходящего места для объявления не нашлось, то объявление не вешается на стенд. Ваша задача состоит в том, чтобы для каждого объявления определить, как высоко оно будет располагаться (в каком ряду).
Входные данные
Первая строка содержит три целых числа H, W и N (1≤H,W≤109; 1≤N≤200000) — размеры стенда и количество объявлений. Каждая из следующих N строк содержит по одному целому числу Wi (1≤Wi≤109) — ширину i-го объявления.
Выходные данные
Для каждого из объявлений (в порядке следования во входном файле) выведите номер ряда, в котором оно будет размещено. Ряды занумерованы от 1 до H сверху вниз. Если объявление разместить нельзя — выведите «–1».
| |
|
|
Испытание силомера
Дерево отрезков, RSQ, RMQ
Сайтама выполняет последовательные удары по силомеру. Силомер представляет из себя массив целых чисел длины \(n\). Изначально \(i\)-е число массива равно \(a_i\) для всех \(i\).
Вам необходимо обработать \(q\) событий, происходящих с силомером. Событие номер \(i\) может быть одного из трех типов:
-
подходит наблюдатель и просит посчитать сумму чисел массива на отрезке \([l_i; r_i]\), то есть величину \(a_{l_i} + a_{{l_i}+1} + \ldots + a_{r_i}\);
-
Сайтама наносит обычный удар силы \(x_i\) по отрезку \([l_i; r_i]\): всем элементам массива на позициях от \(l_i\) до \(r_i\) включительно присваивается значение \(x_i\)
-
Сайтама наносит сильный удар по отрезку \([l_i; r_i]\): для всех \(j\) от \(l_i\) до \(r_i\) включительно происходит присваивание \(a_j \gets \mathtt{popcount}(a_j)\).
Здесь \(\mathtt{popcount}(x)\) — это количество единичных бит в двоичной записи числа \(x\). Иными словами, при событии третьего типа каждое число на отрезке события заменяется на количество своих единичных бит.
На каждый подход наблюдателя, то есть событие первого типа, сообщите ему интересующую его сумму.
Формат входных данных
В первой строке записаны два целых числа \(n\) и \(q\) — длина массива и количество событий (\(1 \leqslant n, q \leq 2 \cdot 10^5\)).
Во второй строке через пробел записаны \(n\) целых чисел \(a_1\), …, \(a_n\) — изначальные элементы массива силомера (\(0 \leqslant a_i \leqslant 10^9\)).
Следующие \(q\) строк описывают события. Первое число \(t_i\) в описании события — тип события (\(1 \leqslant t \leqslant 3\)). Следующие два заданные через пробел числа — это границы отрезка \(l_i\) и \(r_i\) (\(1 \leqslant l_i \leqslant r_i \leqslant n\)). Если это событие второго типа, то есть \(t_i = 2\), далее следует число \(x_i\), обозначающее, что надо выполнить присваивания \(a_j \gets x_i\) для всех \(l_i \leqslant j \leqslant r_i\) (\(0 \leqslant x_i \leqslant 10^9\)).
Для каждого события первого типа выведите в отдельной строке сумму элементов массива на отрезке, заданном этим событием.
| |
|
|
Why Did the Cow Cross the Road III
Дерево отрезков, RSQ, RMQ
Фермер Джон продолжает исследование переходов коров через дорогу,
описанную в двух предыдущих задачах. Теперь он считает дружественными породы коров
\(a\) и \(b\), если if \(|a - b| \leq K\), и недружественными в противном случае.
По заданному упорядочению пород на каждой из сторон дороги, определите
количество недружественных пересекающихся пар пород, где пересекающиеся пары пород
определены в предыдущей задаче.
ФОРМАТ ВВОДА (файл friendcross.in):
Первая строка ввода содержит \(N\) ( \(1 \leq N \leq 100,000\)) и \(K\) ( \(0 \leq K < N\)).
Следующие \(N\) строк описывают порядок по номерам пород, полей на первой стороне дороги.
Каждый номер породы - это число в интервале \(1 \ldots N\). Последние \(N\) строк описывают
порядок по номерам пород, полей на второй стороне дороги. Каждый номер породы появится
ровно один раз с каждом порядке.
ФОРМАТ ВВОДА (файл friendcross.out):
Выведите максимальное количество недружественных пересекающихся пар пород.
| |
|
|
Promotion Counting
Дерево отрезков, RSQ, RMQ
Коровы, последовательно пронумерованные \(1 \ldots N\) (\(1 \leq N \leq 100,000\)),
организовали компанию в виде дерева, где корова 1 - президент (корень дерева).
Каждая корова, кроме президента, имеет ровно одного менеджера (её родитель в дереве).
Каждая корова \(i\) имеет различный професиональный рейтинг \(p(i)\), который описывает
насколько хорошо она делает свою работу. Если корова \(i\) есть менеджер коровы \(j\),
то мы говорим, что корова \(j\) подчиняется корове \(i\).
К несчастью коровы обнаружили что часто бывает так, что менеджер имеет меньший
уровень профессиональности, чем некоторые из его подчинённых. В этом случае менеджер
должен рассмотреть продвижение этих подчинённых. Ваша задача - помочь коровам
узнать, когда это случается. Для каждой коровы \(i\) в компании вычислите количество
подчинённых \(j\) таких, что \(p(j) > p(i)\).
ФОРМАТ ВВОДА (файл promote.in):
Первая строка ввода содержит \(N\).
Следующие \(N\) строк ввода содержат рейтинги профессиональности коров \(p(1) \ldots p(N)\).
Все числа - различные целые в интервале \(1 \ldots 1,000,000,000\).
Следующие \(N-1\) строк описывают менеджера (родителя) для коров \(2 \ldots N\).
Напомним что у коровы 1 нет менеджера, поскольку она президент.
ФОРМАТ ВЫВОДА (файл promote.out):
Выведите \(N\) строк. \(i\)-ая строка вывода должна говорить количество подчинённых коровы \(i\)
с рейтингом профессиональности большим чем у коровы \(i\).
| |
|
|
Balanced Photo
Дерево отрезков, RSQ, RMQ
Фермер Джон выстроил свои \(N\) коров в ряд, чтобы сделать фото.
(\(1 \leq N \leq 100,000\)). Высота \(i\)-ой коровы в этой последовательности
равна \(h_i\), и все эти высоты различны.
ФД хочет, чтобы фотография получилась красивее. Он считает, что корова \(i\)
выглядит несбалансированно, если \(L_i\) и \(R_i\) отличаются более чем в 2 раза.
Здесь \(L_i\) и \(R_i\) - количества коров, которые выше чем корова \(i\), слева и
справа соответственно. То есть, корова \(i\) является несбалансированной, если
большее из чисел \(L_i\) и \(R_i\) строго более чем в 2 раза больше, чем меньшее
из этих двух чисел.
Вычислите сколько всего есть несбалансированных коров.
ФОРМАТ ВВОДА (файл bphoto.in):
Первая строка ввода содержит число \(N\). Следующие \(N\) строк содержат
\(h_1 \ldots h_N\), каждое неотрицательное целое не более чем 1,000,000,000.
ФОРМАТ ВЫВОДА (файл bphoto.out):
Выведите количество несбалансированных коров.
| |
|
|
Counting Haybales
Дерево отрезков, RSQ, RMQ
Ферма Джона состоит из \(N\) полей в ряд последовательно пронумерованных
\(1 \ldots N\). На каждом поле может быть произвольное количество стогов сена.
Инструкции ФД бывают трёх видов:
1) Добавить один стог к каждому полю в указанном интервале
2) Определить минимальное количество стогов сена внутри указанного
непрерывного интервала полей.
3) Посчитать суммарное количество стогов сена внутри указанного непрерывного интервала.
ФОРМАТ ВВОДА (файл haybales.in):
Первая строка содержит два положительных целых числа \(N\) ( \(1 \leq N \leq 200,000\)) и
\(Q\) ( \(1 \leq Q \leq 100,000\)).
Следующая строка содержит \(N\) неотрицательных целых чисел, каждое не более,
чем 100,000, указывающих, сколько стогов сена было изначально на каждом поле.
Каждая из следующих \(Q\) строк содержит одну большую латинскую букву
M, P или S, за которой следуют два положительных целых числа \(A\) and \(B\) (\(1 \leq A \leq B \leq N\)), или три положительных целых числа \(A\), \(B\), and \(C\) (\(1 \leq A \leq B \leq N\); \(1 \leq C \leq 100,000\)). 3 числа будет только в том случае, если первая буква P.
Если первая буква M выведите минимальное количество стогов сена
в интервале полей \(A \ldots B\).
Если первая буква P, добавьте по \(C\) стогов сена в каждое поле в интервале
\(A \ldots B\).
Если первая буква S, выведите суммарное количество стогов сена в интервале полей
\(A \ldots B\).
ФОРМАТ ВЫВОДА (файл haybales.out):
Строка в выводе должна появится в ответ на каждый запрос вида M или S.
| |
|
|
The Best Subsequence
Дерево отрезков, RSQ, RMQ
п»ї
У Фермера Джона есть двоичная строка длиной \(N\) \((1 \leq N \leq 10^9)\),
изначально из одних нулей.
Сначала он выполнит \(M\) (\(1 \leq M \leq 2 \cdot 10^5\)) изменений строки
по порядку. Каждое изменение переворачивает каждый символ от \(l\) до \(r\).
То есть \(0\) изменяется на \(1\) и наоборот.
Затем он задаёт Вам \(Q\) (\(1 \leq Q \leq 2 \cdot 10^5\)) вопросов.
Для каждого вопроса Вы должны ввести лексикографически наибольшую подпоследовательность
длины \(k\) состоящую из символов подстроки от \(l\) до \(r\).
Если Ваш ответ - двоичная строка \(s_1s_2 \dots s_k\), выведите
\(\sum_{i=0}^{k-1} 2^i \cdot s_{k-i}\)
(то есть строка интерпретируется как двоичное число)
по модулю \(10^9+7\).
Подпоследовательность это строка, которая может быть получена из другой строки
удалением (или не удалением) символов без изменения порядка оставшихся символов.
Напомним, что строка \(A\) лексикографически больше чем строка \(B\) такой же длины
если и только если в первой позиции \(i\), если она существует,
\(A_i \neq B_i\), выполняется \(A_i > B_i\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\), \(M\), \(Q\).
Следующие \(M\) строк содержат по два целых числа \(l\) и \(r\) (\(1 \leq l \leq r \leq N\))
конечные точки обновления.
Следующие \(Q\) строк содержат по три целых числа, \(l\), \(r\), \(k\)
(\(1 \leq l \leq r \leq N, 1 \leq k \leq r - l + 1\)) —
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(Q\) строк. \(i\)-ая строка должна содержать ответ на \(i\)-ый запрос.
ПР�МЕРВВОДА:
5 3 9
1 5
2 4
3 3
1 5 5
1 5 4
1 5 3
1 5 2
1 5 1
2 5 4
2 5 3
2 5 2
2 5 1
ПР�МЕРВЫВОДА:
21
13
7
3
1
5
5
3
1
После выполнения \(M\) операций, строка такова: \(10101\).
Для первого запроса - длины \(5\) ответ вся строка \(10101\),
которая интерпретируется как
\(1 \cdot 2^4 + 0 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 = 21\).
Для второго запроса, существует \(5\) уникальных подпоследовательностей длины \(4\):
\(0101\), \(1101\), \(1001\), \(1011\), \(1010\).
Лексикографически наибольшая из них \(1101\),
которая интерпретируется как
\(1 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1\cdot 2^0 = 13\).
Для третьей строки лексикографически наибольшая последовательность \(111\),
которая интерпретируется как \(7\).
ПР�МЕРВВОДА:
9 1 1
7 9
1 8 8
ПР�МЕРВЫВОДА:
3
ПР�МЕРВВОДА:
30 1 1
1 30
1 30 30
ПР�МЕРВЫВОДА:
73741816
Не забудьте выводить ответ по модулю \(10^9+7\).
ОЦЕН�ВАН�Е:
- Тест 4: \(N \leq 10, Q \leq 1000\)
- Тест 5: \(M \leq 10\)
- Тесты 6-7: \(N, Q \leq 1000\)
- Тесты 8-12: \(N \leq 2 \cdot 10^5\)
- Тесты 13-20: Нет дополнительных ограничений.
Автор: Chongtian Ma
| |
|
|
Pareidolia
дп
Дерево отрезков, RSQ, RMQ
реализация
**Примечание. Ограничение по времени для этой задачи составляет 4 секунды, что в два раза больше, чем по умолчанию.
Ограничение по памяти для этой задачи составляет 512 МБ, вдвое больше, чем по умолчанию.**
Парейдолия – это явление, при котором ваши глаза склонны видеть в изображениях знакомые узоры,
которых на самом деле не существует — например, видение лица в облаке. Поскольку фермер Джон
постоянно находится рядом с коровами, он часто видит
коровьи узоры в повседневных предметах. Например, если он смотрит на
строка "bqessiyexbesszieb", глаза фермера Джона игнорируют некоторые буквы и
все, что он видит, это «bessiebessie».
Дана строка \(s\), пусть \(B(s)\) представляет собой максимальное количество повторяющихся копий.
из «bessie» можно получить, удалив ноль или более символов из \(s\).
В приведенном выше примере \(B(\)"bqessiyexbesszieb"\() = 2\). Кроме того, учитывая
строка \(t\), пусть \(A(t)\) представляет собой сумму \(B(s)\) по всем непрерывным
подстроки \(s\) строки \(t\).
У фермера Джона есть строка \(t\) длины не более \(2\cdot 10^5\), состоящая только из
символов a-z. Пожалуйста, рассчитайте \(A(t)\) и как \(A(t)\) изменится после \(U\)
(\(1\le U\le 2\cdot 10^5\)) обновлений, каждое из которых изменяет символ \(t\). Обновления
являются кумулятивными.
ФОРМАТ ВВОДА (ввод поступает с терминала/стандартного ввода):
Первая строка ввода содержит \(t\).
Следующая строка содержит \(U\), за которыми следуют строки по \(U\), каждая из которых содержит позицию \(p\)
(\(1\le p\le N\)) и символ \(c\) в диапазоне от a до z, что означает, что \(p\)-й
символ \(t\) заменяется на \(c\).
ФОРМАТ ВЫВОДА (вывод на терминал / стандартный вывод):
Выведите \(U+1\) строк — общее количество «bessie», которое можно сделать во всех
подстроках \(t\) перед любыми обновлениями и после каждого обновления.
| |
|
|
Haircut
Дерево отрезков, RSQ, RMQ
Фермер Джон решил постричься.
У него есть \(N\) прядей волос (\(1\le N\le 10^5\)), расположенных последовательно.
Прядь \(i\) имеет изначально длину \(A_i\) микрометров (\(0\le A_i\le N\)).
В идеале ФД хочет, чтобы его пряди монотонно возрастали по длине. Поэтому он
определил "негодность" волос как количество инверсий то есть пар \((i,j)\)
таких, что \(i < j\) и \(A_i > A_j\).
Для каждого \(j=0,1,\ldots,N-1\), ФД хочет узнать "негодность" его волос
если все пряди с длиной больше чем \(j\) будут уменьшены до длины ровно \(j\).
ФОРМАТ ВВОДА (файл haircut.in):
Первая строка содержит \(N\).
Вторая строка содержит \(A_1,A_2,\ldots,A_N.\)
ФОРМАТ ВЫВОДА (файл haircut.out):
Для каждого \(j=0,1,\ldots,N-1\), выведите "негодность" волос ФД в новой строке.
Заметим, ответы могут потребовать 64-битного типа данных
(например, "long long" в C/C++).
| |
|
|
Cow Land
Дерево отрезков, RSQ, RMQ
CowLand это специальный парк развлечений для коров, где они бродят, едят
вкусную траву и посещают различные аттракционы для коров.
Всего имеется \(N\) различных аттракционов (\(2 \leq N \leq 10^5\)).
Определённые пары аттракционов связаны дорожками, которых всего \(N-1\) штук,
таким образом, что существует единственный путь, состоящий из различных дорожек
между любыми двумя аттракционами. Каждый аттракцион \(i\) имеет целую величину
удовольствия \(e_i\), которая может измениться в течение дня, поскольку некоторые
аттракционы более привлекательны утром, а некоторые - вечером.
Корова, которая проходит от аттракциона \(i\) до аттракциона \(j\) получает
удовольствие всех аттракционов маршрута от \(i\) до \(j\). Забавно, что общее удовольствие
от всего маршрута вычисляется как побитовое XOR всех удовольствий в течение
маршрута, включая удовольствия в аттракционах \(i\) и \(j\).
Помогите коровам определить величины удовольствий маршрутов, которые
коровы собираются пройти в CowLand.
ФОРМАТ ВВОДА (файл cowland.in):
Первая строка ввода содержит \(N\) и количество запросов \(Q\) ( \(1 \leq Q \leq 10^5\)).
Следующая строка содержит \(e_1 \ldots e_N\) ( \(0 \leq e_i \leq 10^9\)).
Каждая из следующих \(N-1\) строк описывает дорожку в терминах двух номеров
целочисленных аттракционов \(a\) и \(b (оба в интервале \)1 \ldots N$).
Наконец, каждая последних \(Q\) строк описывает или изменение одной из величин
\(e_i\) или запрос на удовольствие от маршрута.
Строка вида "1 \(i\) \(v\)" означает, что величину \(e_i\) нужно изменить на значение
\(v\) ( \(e_i\) should be updated to value \(v\)).
Строка вида "2 \(i\) \(j\)" это запрос на удовольствие от маршрута, соединяющего
аттракционы \(i\) и \(j\).
В тестах не более 50% не будет изменений удовольствий на аттракционах.
ФОРМАТ ВЫВОДА (файл cowland.out):
Для каждого запроса вида "2 \(i\) \(j\)", выведите одну строку - удовольствие
от маршрута от \(i\) к \(j\).
| |
|
|
Bessie's Snow Cow
Дерево отрезков, RSQ, RMQ
Снег выпал на ферме, и Беси лепит из него снежную корову.
Причём Беси хочет, чтобы та выглядела как можно более натурально.
Но в этом году она лепит фигуру в виде дерева, состоящего из \(N\) снежков
\((1\le N\le 10^5)\) соединённых \(N-1\) ветками, каждая из которых соединяет
пару снежков так, что имеется уникальный путь между каждой парой снежков.
Беси добавила нос к одному из снежков, поэтому он представляет собой голову
этой абстрактной снежной коровы. Она обозначила это снежок числом 1.
Чтобы усилить визуальный эффект, она планирует покрасить некоторые из снежков
различными цветами. Цвета обозначаются числами в интервале \(1 \ldots 10^5\),
и у Беси неограниченное количество красок всех цветов.
Когда Беси красит снежок в определённый цвет, все снежки в его поддереве
также красятся в этот же цвет. (Снежок \(y\) находится в поддереве снежка \(x\),
если \(x\) находится на пути от \(y\) к головному снежку).
Занимаясь покраской, Беси обеспечивает, чтобы все цвета, которыми она красила
снежки, оставались видимыми. Например, если у снежка есть цвета \([1,2,3]\)
и Беси красит цветом \(4\), на снежке останутся следы цветов \([1,2,3,4]\).
После некоторого количества раскрашиваний, Беси хочет узнать, как раскрашена часть
её коровы. Полнота цветов("colorfulness") снежка \(x\) равно количеству различных
цветов \(c\), которыми раскрашен этот снежок \(x\). Если Беси спросит Вас о снежке
\(x\), Вы должны ответить сумму полноты цветов всех снежков в поддереве \(x\).
Помогите Беси определить полноту цветов в определённые моменты времени.
ОЦЕНИВАНИЕ:
\(Q\) определено ниже.
- Тесты 2-3 удовлетворяют \(N\le 10^2, Q\le 2\cdot 10^2.\)
- тесты 4-6 удовлетворяют \(N\le 10^3, Q\le 2\cdot 10^3.\)
ФОРМАТ ВВОДА (файл snowcow.in):
Первая строка содержит \(N\), и количество запросов \(Q\) ( \(1\le Q\le 10^5\)).
Каждая из последующих \(N-1\) строк содержит два разделённых одиночным пробелом
целых числа \(a\) и \(b\), описывающих ветки, соединяющие снежки \(a\) и \(b\) (\(1 \le a, b \le N\)).
Каждая из последних \(Q\) строк содержит запрос. Запрос имеет вид
1 x c
и означает. что Беси закрасила цветом \(c\) снежок \(x\) и всё его поддерево.
Строка вида
2 x
Это запрос на сумму "полноцветностей" всех снежков в поддереве \(x\).
\(1\le x\le N\) и \(1\le c\le 10^5.\)
ФОРМАТ ВЫВОДА (файл snowcow.out):
Для каждого запроса типа 2, выведите сумму "полноцветностей" соответствующего
поддерева.
Заметим. что Вы должны использовать 64-ное целое, чтобы избежать переполнения.
| |
|
|
Milk Visits
Деревья
графы
Дерево отрезков, RSQ, RMQ
Фермер Джон планирует построить \(N\) (\(1 \leq N \leq 10^5\)) ферм, которые будут
соединены \(N-1\) дорогой, формируя дерево (то есть каждая ферма достижима от каждой,
и нет циклов). Каждая ферма содержит корову целого типа \(T_i\) между \(1\) и \(N\)
включительно.
\(M\) друзей ФД (\(1 \leq M \leq 10^5\)) часто его посещают. Во время визита
друга \(i\), ФД вместе с ним путешествует по уникальному пути от фермы \(A_i\) до
фермы \(B_i\) (возможно \(A_i = B_i\)). Дополнительно, они пробуют молоко каждой
коровы на своём пути. Поскольку друзья ФД также фермеры, они имеют сильное
предпочтение по молоку. Каждый из них пьёт молоко только определённого типа коров.
Любой из друзей ФД будет счастливым, только если сможет попить свой предпочитаемый
тип молока во время пути.
Определите для каждого друга, будет ли он счастливым.
ОЦЕНИВАНИЕ:
- Тест 2 второй пример, приведенный ниже.
- Тест 3 удовлетворяет \(N\le 10^3, M\le 2\cdot 10^3\).
- Тесты 4-7 удовлетворяют \(C_i\le 10\) (\(C_i\) определено ниже).
ФОРМАТ ВВОДА (файл milkvisits.in):
Первая строка ввода содержит числа \(N\) и \(M\).
Вторая строка ввода содержит \(N\) разделённых целых чисел \(T_1,T_2,\ldots, T_N\).
Тип коровы на \(i\)-ой ферме обозначен \(T_i\).
Каждая из последующих \(N-1\) строк содержит два различных целых числа \(X\) и \(Y\)
(\(1 \leq X, Y \leq N\)), указывающих, что имеется дорожка между фермами \(X\) и \(Y\).
Последующие \(M\) строк содержат целые числа \(A_i\), \(B_i\), \(C_i\).
\(A_i\) и \(B_i\) представляют конечные точки пути во время визита \(i\)-ого друга,
\(C_i\) (\(1\le C_i\le N\)) указывает тип молока, предпочитаемый этим другом.
ФОРМАТ ВЫВОДА (файл milkvisits.out):
Выведите двоичную строку длины \(M\). \(i\)-ый символ этой строки должен быть '1',
если \(i\)-ый друг будет счастлив, иначе - '0'.
| |
|
|
Train Tracking
Дерево отрезков, RSQ, RMQ
Каждое утро экспресс-поезд следует от фермы в город, а каждый вечер
он возвращается.
Беси знает, что у поезда есть \(N\) вагонов(\(1 \leq N \leq 10^6\)),
последовательно пронумерованных \(0 \dots N-1\). Вагон \(i\) имеет ID номер
\(c_i\), написанный на нём (\(0 \le c_i \le 10^9\)). Все номера видны и утром,
и вечером, поэтому номер каждого вагона можно увидеть два раза.
Когда поезд едет утром, Беси видит вагоны в таком порядке
\(c_0\), \(c_1\), ... \(c_{N-1}\).
Когда поезд едет вечером, Беси видит их в том же порядке:
\(c_0\), \(c_1\), ... \(c_{N-1}\).
Беси выбрала целое число \(K\) (\(1 \leq K \leq N\)), и она хочет определить
минимальный ID-номер для каждого непрерывного множества из \(K\) вагонов.
У Беси есть ноутбук, на котором она может производить вычисления. Но он довольно
маленький, а её копыта - большие. Например, она не может написать все \(N+1-K\)
минимумов. Беси мычит ответы, после того, как вычислит их.
Поезд скоро прибудет, Помогите Беси определить \(N + 1 - K\) минимумов
когда поезд проезжает дважды, будьте уверены , что она использует свой ноутбук
эффективно. Её ноутбук поделен на \(5500\) секций, последовательно пронумерованных
\(0 \dots 5499\), и каждая секция имеет место, чтобы хранить ровно одно целое число
из интервала \(-2^{31}\) ... \(2^{31}-1\) включительно. Изначально в каждой секции
хранится число \(0\).
Это интерактивная задача, вы должны разработать следующую функцию,
которая поможет Беси использовать эффективно свой ноутбук.
void helpBessie(int ID);
Ваша функция будет вызываться с номером проходящего вагона в качестве
параметра.
Ваша реализация функции \(\texttt{helpBessie}\) должна вызывать следующие функции:
- int get(int index): получает значение целого числа,
которое хранится в ноубуке беси в данной ячейке index.
- void set(int index, int value): устанавливает значение целым числом value
в ячейке index
- void shoutMinimum(int output): говорит Беси промычать данное число
- int getTrainLength(): возвращает \(N\), количество вагонов поезда.
- int getWindowLength(): возвращает \(K\), длину окна.
- int getCurrentCarIndex(): возвращает индекс вагона, который сейчас проходит.
- int getCurrentPassIndex(): возвращает \(0\)
если Беси наблюдает утренний поезд и \(1\), если Беси наблюдает вечерний поезд.
Чтобы помочь Вам начать писать свой код, мы даём начальные шаблоны для
C/C++ и
Java. Python и Pascal не поддерживаются в этой задаче.
Минимумы окон должны выводится в таком порядке, что минимум из вагонов
\(0, 1, \dots, K-1\) нужно вывести раньше чем минимум вагонов
\(1, 2, \dots, K\)
и т.д.
Но помимо этого ограничения упорядочения,Ваша функция может выводить
минимумы во время любого из её вызовов, в любое время.
Например, Ваша функция может не выводить ответов во время некоторых вызовов или
выводить множество ответов во время других вызовов.
Беси имеет фантастическую кратковременную память, по этой причине нет ограничения
на использование памяти в функции \(\texttt{helpBessie}\) кроме обычного на 256 Мбт.
Однако между вагонами Беси не способна помнить ничего не содержащегося в её ноутбуке.
Поэтому между вызовами функции, Ваша программа не может хранить состояния -
а только использовать вызовы \(\texttt{get}\) и \(\texttt{set}\) calls.
Это означает:
Вам запрещено создавать глобальные или статические переменные.
Любое решение, которое делает это будет дисквалифицировано. Тренеры вручную
проанализируют решения, на это предмет. Вам также запрещено делать любые
операции ввода-вывода.
Общее количество вызовов \(\texttt{set}\) плюс общее количество вызовов
\(\texttt{get}\), сделанные Вашей программой должны быть ограничены \(25 \cdot 10^6\)
для каждого теста.
| |
|
|
Disruption
Двоичные подьемы
Дерево отрезков, RSQ, RMQ
Ферма Джона состоит из \(N\) пастбищ (\(2 \leq N \leq 50,000\)), попарно
соединённых \(N-1\) двунаправленными дорожками единичной длины. Известно также,
что имеется путь из любого пастбища к любому.
Однако если одну из дорожек заблокировать, то ферма разделится на две части,
внутри каждой из которых связность сохранится, а между ними - нет.
Поэтому ФД строит \(M\) дополнительных дорожек (\(1 \leq M \leq 50,000\)),
каждая из которых имеет положительную целую длину не более \(10^9\).
Коровы пользуются исходными дорожками, пока это возможно.
Если одна из изначальных дорожек становится заблокированной, ферма
становится несвязной и ФД выбирает из дополнительных дорожек, такую, которая
восстановит связность фермы, так чтобы коровы вновь могли ходить из любого
пастбища в любое.
Для каждой из исходных дорожек фермы, помогите ФД определить кратчайшую
подходящую дорожку из вновь построенных.
ФОРМАТ ВВОДА (файл disrupt.in):
Первая строка ввода содержит \(N\) и \(M\). Каждая из последующих \(N-1\) строк
описывает оригинальную дорожку целыми числами \(p\) \(q\), где \(p\) \neq q$
- пастбища, соединённые этой дорожкой (в интервале \(1 \ldots N\)).
Каждая из оставшихся \(M\) строк описывает дополнительную дорожку тремя
целыми числами \(p\), \(q\), \(r\), где \(r\) длина этой дорожки. Не более одной
дорожки пролегает между любыми двумя пастбищами.
ФОРМАТ ВЫВОДА (файл disrupt.out):
Для каждой из \(N-1\) оригинальных дорожек, в порядке как они появились
на вводе, выведите длину кратчайшей "замещающей" дорожки, которая восстановит
связность фермы в результате блокировки оригинальной дорожки.
Если такой дорожки не существует, выведите -1.
| |
|
|
Seating
Дерево отрезков, RSQ, RMQ
Чтобы заработать немного денег, коровы открыли ресторан. В ресторане N мест (1 <= N <= 500,000) в одном ряду. Изначально, все они пусты. В течение дня в ресторане происходят M (1 <= M <= 300,000) различных событий одного из двух типов: 1. Прибывает вечеринка размером p (1 <= p <= N). Беси хочет усаживать вечеринку на непрерывный блок из p мест. Если таких блоков несколько, то она садит вечеринку на блок с самым маленьким номером начальной позиции. Если такого блока нет, вечеринка убывает. 2. Задается диапазон [a,b] (1 <= a <= b <= N), и каждый в этом диапазоне мест, подымается и покидает ресторан. Помогите Беси вычислит общее количество вечеринок, которые "уйдут несолоно хлебавши" в течение дня. PROBLEM NAME: seating Формат входных данных * Строка 1: Два разделенных пробелом целых числа, N и M. * Строки 2..M+1: Каждая строка описывает одно событие в форме "A p" (что означает прибытие вечеринки размером p) или в форме "L a b" (что означает, что все коровы в диапазоне [a,b] уходят). Формат выходных данных * Строка 1: Количество вечеринок, которые не начнутся. Примечание Вечерника #3 не сможет быть размещена. Все другие вечеринки состоятся.
| |
|
|
Optimal Milking
Дерево отрезков, RSQ, RMQ
Фермер Джон купил новый амбар, содержащий N (1 <= N <= 40,000) доильных машин, последовательно пронумерованных от 1 до N и расположенных в ряд. Доильная машина i способна извлекать по M(i) (1 <=M(i) <= 100,000) единиц молока в день. Однако, они установлены так близко, что, если машина I используется в какой-то день, то в этот день не могут быть использованы две соседние машины (начальная и конечная машина имеют по одному соседу). ФД может выбирать различные подмножества работающих машин в различные дни. ФД хочет вычислить максимальное количество молока, которое он может извлечь за серию из D(1 <= D <= 50,000) дней. В начале каждого дня у него есть достаточное количество времени, чтобы выполнить модификацию одной выбранной машины I, и изменить дневной выпуск молока этой машины от прошлого дня к сегодняшнему. Вам дан список этих ежедневных модификаций, определите, сколько молока может извлечь ФД в течение D дней (заметим, что это число может не вместиться в 32-битное целое). PROBLEM NAME: optmilk Формат входных данных * Строка 1: Значения N и D. * Строки 2..1+N: Строка i+1 содержит начальное значение M(i). * Строки 2+N..1+N+D: Строка 1+N+d содержит два целых числа i и m, означающие, что ФД изменил значение M(i) на m в начале дня d. Формат выходных данных * Строка 1: Максимальное суммарное количество молока, которое ФД сможет произвести за D дней. Примечание В день 1 оптимальное количество молока 2+4 = 6 (также достижимое как 1+3+2). В день 2 оптимальное количество молока 7+4=11. В день 3 оптимальное количество молока 10+3+2=15.
| |
|
|
Running Away From the Barn
Деревья
Дерево отрезков, RSQ, RMQ
Время дойки на ферме Джона, но коровы сбежали. Ферма Джона - это множество из N (1 <= N <= 200,000) пастбищ, пронумерованных от 1 до N, и связанных N - 1 двунаправленными дорожками. Амбар расположен в пастбище 1 и любое пастбище достижимо от амбара. Коровы бегут в сторону "от амбара" и они пробегают расстояние не больше чем L. Для каждого пастбища ФД хочет знать, в скольки различных пастбищах могут оказаться коровы, сбежавшие с этого пастбища. Замечание: используйте 64-битные целые (int64 в Pascal, long long в C/C++ и long в Java) для хранения расстояний. PROBLEM NAME: runaway Формат входных данных * Строка 1: 2 целых числа, N и L (1 <= N <= 200,000, 1 <= L <= 10^18) * Строки 2..N: i-ая строка содержит два целых числа pi и li. pi (1 <= pi < i) - первое пастбище на кратчайшем пути между пастбищем i и амбаром li (1 <= li <= 10^12) - длина этого пути Формат выходных данных * Строки 1..N: По одному числу в строке. Число в строке i - количество пастбищ, которые могут быть достигнуты из пастбища i, выбирая дороги, строго удаляясь от амбара (пастбище 1) с суммарной длиной не превышающей L. Примечание Корова из пастбища 1 может добежать до пастбищ 1, 2, 4. Корова из пастбища 2 может добежать до пастбищ 2, 3. Пастбища 3 и 4 - конечные, оттуда некуда бежать, можно только остаться в них.
| |
|
|
Минимальный и максимальный балл
Дерево отрезков, RSQ, RMQ
На шахматном турнире участники получают баллы. Судья хочет в любой момент знать: какой максимальный и какой минимальный балл среди всех участников?
Участники могут присоединяться к турниру или выбывать:
+ X — игрок с баллом X пришёл на турнир
- X — игрок с баллом X ушёл с турнира
? — запрос минимального и максимального балла
Формат входных данных
В первой строке — число Q (1 ≤ Q ≤ 100000) — количество событий.
В следующих Q строках — события в указанном формате.
Гарантируется, что при удалении игрок с таким баллом существует, и при запросе есть хотя бы один игрок.
Формат выходных данных
Для каждого запроса "?" выведите два числа через пробел: минимальный и максимальный балл.
| |
|
|
E. Инна и большая матрица конфет
Дерево отрезков, RSQ, RMQ
Инна очень любит сладкое. Поэтому она хочет сыграть в игру «Матрица конфет» с Димой и Сережей. Но Сережа очень большой, и игра для него оказалась маленькой. Сережа предложил поиграть в «Большую матрицу конфет». Поле для игры «Большая матрица конфет» — это матрица размера n × m. Будем нумеровать строки матрицы от 1 до n, а столбцы — от 1 до m. Ячейку в i-ой строке и j-ом столбце будем обозначать (i, j). В каждой ячейке матрицы может лежать несколько конфет, изначально все ячейки пустые. Игра происходит в w ходов, на каждом ходу происходит одно из двух следующих событий: - Сережа выбирает пять целых чисел x1, y1, x2, y2, v (x1 ≤ x2; y1 ≤ y2) и в каждую ячейку матрицы (i, j) (x1 ≤ i ≤ x2; y1 ≤ j ≤ y2) докладывает v конфет.
- Сережа выбирает четыре целых числа x1, y1, x2, y2 (x1 ≤ x2; y1 ≤ y2). Затем он просит Диму посчитать суммарное количество конфет в ячейках (i, j) (x1 ≤ i ≤ x2; y1 ≤ j ≤ y2), а Инну просит посчитать суммарное количество конфет в ячейках матрицы (p, q), которые удовлетворяют логическому условию: (p < x1 ИЛИ p > x2) И (q < y1 ИЛИ q > y2). Наконец, Сережа просит записать на листке разность числа, посчитанного Димой, и числа, посчитанного Инной (Д - И).
К сожалению, матрица Сережи оказалось воистину огромной. Поэтому Инна и Дима не справляются с подсчетом. Помогите им! Выходные данные Для каждого хода второго типа выведите в отдельной строке целое число — разность между числами Димы и Инны. Примечание Пояснение к примеру. После первого запроса матрица принимает вид: 22200 22200 00000 00000
После второго: 22200 25500 03300 00000
После третьего: 22201 25501 03301 00001
Для четвертого запроса сумма Димы равна 5 + 0 + 3 + 0 = 8, а сумма Инны равна 4 + 1 + 0 + 1 = 6. Ответ на запрос равен 8 - 6 = 2. Для пятого запроса сумма Димы равна 0, а сумма Инны равна 18 + 2 + 0 + 1 = 21. Ответ на запроса равен 0 - 21 = -21.
| |
|
|
Кислотные дожди
Дерево отрезков, RSQ, RMQ
Для сборки лаборатории-поселения на Венеру доставлены \(n\) блоков. Блоки расположены в ряд, \(i\)-й блок имеет высоту \(h_i\).
Сборку будет осуществлять специальный робот. В процессе сборки последовательные сегменты блоков будут постепенно объединяться. При этом порядок блоков в ряду не будет меняться.
Исходно каждый блок представляет собой отдельный сегмент, сегменты пронумерованы от \(1\) до \(n\) в том же порядке, что и блоки. Если есть два соседних сегмента, составленных из блоков: сегмент из блоков \(A = [i, i+1, \ldots, i+p-1]\) и сегмент из блоков \(B = [i+p, i+p+1, \ldots, i+p+q-1]\), то после их объединения в один получается сегмент \(AB = [i, i+1, \ldots, i+p-1, i+p, i+p+1, \ldots, i+p+q-1]\).
Инструкция по сборке состоит из \(n-1\) инструкций. Каждая инструкция характеризуется одним числом, \(j\)-я инструкция характеризуется числом \(k_j\). После выполнения этой инструкции сегменты с номерами \(k_j\) и \(k_j + 1\) объединяются в один, получившийся сегмент занимает место в последовательности сегментов на месте двух объединенных сегментов, и вводится новая нумерация на сегментах в том порядке, в котором они расположены — номера сегментов, начиная с \(k_j + 2\), уменьшаются на один. После выполнения всех инструкций все сегменты окажутся объединены в один общий сегмент.
На Венере постоянно идут кислотные дожди, поэтому в процессе сборки важно для каждого сегмента блоков понимать, сколько жидкости может скопиться в этом сегменте. Пусть сегмент состоит из блоков высотой \(h_l, h_{l+1}, \ldots, h_r\). Для \(p\), где \(l \le p \le r\) определим глубину блока c высотой \(h_p\) в этом сегменте следующим образом. Посчитаем величины \(l_p = \max \{ h_l, \ldots, h_p \}\), \(r_p = \max \{ h_p, \ldots, h_r\}\). Это самые высокие блоки в сегменте слева и справа от \(p\)-го. Тогда глубина блока \(p\) в его сегменте равна \(d_p = \min(l_p, r_p) - h_p\), заметим, что \(d_p \ge 0\). Емкостью сегмента будем называть сумму глубин блоков этого сегмента, то есть \(w = d_l + d_{l+1} + \ldots + d_r\).
Задана последовательность объединений сегментов. После каждого объединения выведите емкость получившегося сегмента.
Рисунок на следующей странице показывает процесс выполнения инструкции из примера, над каждым блоком указана его глубина, а для нового сегмента показана его емкость.
Формат входных данных
Первая строка содержит одно целое число \(n\) — количество блоков (\(2 \leq n \leq 10^5\)).
Во второй строке записано \(n\) чисел \(h_1, \ldots, h_n\) (\(1 \leq h_i \leq 10^9\)).
В третьей строке записаны \(n - 1\) чисел — инструкции по объединению сегментов. Каждая инструкция характеризуется одним числом \(k_j\) (\(1 \leq k_j \leq n - j\)).
Формат выходных данных
Выведите \(n-1\) чисел — после каждого объединения сегментов выведите емкость получившегося объединенного сегмента.

| |
|
|
Фонари
Дерево отрезков, RSQ, RMQ
дп
Улицу Подводный канал освещают \(n\) фонарей, пронумерованных вдоль улицы от 1 до \(n\). Один или несколько подряд стоящих фонарей назовём сегментом. Таким образом, общее количество сегментов \(\frac{n(n+1)}{2}\). Сегмент считается исправным, если лампочки во всех фонарях этого сегмента исправны.
С фонарями регулярно происходят события одного из двух типов:
в каком-то сегменте из-за скачков напряжения все лампочки одновременно перегорают;
Архиэнерго выбирает некоторый сегмент и посылает ремонтников, чтобы заменить на нем все перегоревшие лампочки на исправные.
После каждого события мэрия города требует от Архиэнерго предоставить отчёт о количестве исправных сегментов. Для улучшения показателей работы ремонтники включают в отчёт все сегменты, которые исправны сейчас или были исправны когда-либо ранее.
Требуется написать программу, определяющую количество сегментов после каждого события, которые исправны в этот момент или были исправны когда-либо до этого события.
Входные данные
В первой строке входных данных содержатся два числа \(n\) и \(q\) — количество фонарей и количество произошедших событий. Следующая строка входных данных состоит из \(n\) символов 0 и 1, описывающих начальное состояние фонарей, где 1 обозначает фонарь с исправной лампочкой, а 0 — с перегоревшей.
В каждой из последующих \(q\) строк содержатся описания событий в виде трёх чисел \(l_i, r_i\) и \(c_i\), которые означают, что после этого события все лампочки в фонарях с номерами \(l_i, l_i+1, \ldots, r_i\):
- перегорают при \(c_i = 0\),
- становятся исправными при \(c_i = 1\).
В описаниях всех событий \(1 \le l_i \le r_i \le n\), а \(c_i\) принимает значение \(0\) или \(1\).
Выходные данные
В первой строке выходных данных выведите единственное число "— количество исправных сегментов в начальном состоянии. Затем по одному в строке выведите \(q\) чисел: для каждого из произошедших событий выведите количество сегментов, указываемых в отчёте после этого события.
| |
|
|
Магистраль "Урал"
Топологическая сортировка
графы
Дерево отрезков, RSQ, RMQ
Планируется строительство новой магистрали <<Урал>>. Долговечность автомагистрали зависит от пластов пород, залегающих под ней. Пластом называется геологическое тело, состоящее из одной горной породы.
Под будущей магистралью залегают \(n\) горизонтальных пластов. Геологическое исследование позволило определить точки магистрали, под которыми начинается и заканчивается каждый из них. При этом порядок залегания пластов по глубине определить не удалось.
В заданных местах вдоль планируемой магистрали пробурены вертикальные скважины. Каждая из них пересекает несколько верхних пластов, находящихся под точкой бурения. Для каждой скважины известно, в каком порядке располагаются пробуренные пласты сверху вниз, начиная от поверхности. Если скважина не пересекает какой-то из пластов, находящихся под точкой бурения, значит он проходит ниже дна скважины.
Требуется написать программу, которая определяет возможный порядок залегания пластов по глубине, не противоречащий полученным данным.
Формат входных данных
Первая строка входного файла содержит целое число \(n\) "— количество пластов. Пласты пронумерованы целыми числами от \(1\) до \(n\) в произвольном порядке.
В \(i\)-й из следующих \(n\) строк содержатся целые числа \(l_i\) и \(r_i\) (\(0 \leqslant l_i < r_i\leqslant 10^9\)) "— расстояния от начала магистрали до точек, под которыми начинается и заканчивается \(i\)-й пласт.
В следующей строке записано целое число \(m\) "— количество скважин, в которых проводилось бурение. Следующие \(m\) строк описывают результаты бурения: в каждой строке сначала указаны два целых числа \(x\) (\(0 \leqslant x \leqslant 10^9\)) и \(k\) (\(0 \leqslant k \leqslant n\)) "— расстояние от начала магистрали до скважины и количество обнаруженных в данной скважине пластов, затем "— целые числа \(s_1, s_2, \ldots, s_k\) "— номера пробуренных пластов, перечисленные в порядке залегания сверху вниз. Скважины перечислены в порядке возрастания расстояния \(x\).
Гарантируется, что решение существует.
Формат выходных данных
Первая строка выходного файла должна содержать \(n\) целых чисел \(p_1, p_2, \ldots , p_n\), описывающих возможный порядок залегания пластов сверху вниз. Среди чисел \(p_1, p_2, \ldots , p_n\) каждый номер пласта должен встретиться ровно один раз. При этом пласт с номером \(p_j\) не должен нигде проходить выше пластов с номерами \(p_1, \ldots ,p_{j-1}\) или ниже пластов с номерами \(p_{j+1}, \ldots , p_n\).
Если возможных расположений пластов несколько, выведите любое из них.
Примечание
Рисунок в условии соответствует примеру. Для приведенного примера правильным также является ответ 2 3 1 4. Обратите внимание, что тест из примера не соответствует подзадаче 1. Для того, чтобы решение было принято на проверку, оно должно проходить тест из примера, даже если решена только эта подзадача.
| |
|
|
Здоровое питание
дп
Дерево отрезков, RSQ, RMQ
реализация
План студенческого городка некоторого университета представляет собой квадрат \(n \times n\), в каждой клетке которого расположено здание. Здания соединены переходами, если они расположены в клетках, имеющих общую сторону. В левом верхнем углу квадрата расположено студенческое общежитие. В правом нижнем углу расположен учебный корпус.
В каждом из зданий, включая общежитие и учебный корпус, расположен автомат, торгующий ровно одним продуктом, например, только кофе или только пирожками с мясом. Студенты каждый день ходят из общежития в учебный корпус по переходам, выбирая один из кратчайших путей.
Руководство университета заинтересовалось разнообразием питания студентов, покупающих продукты в автоматах по ходу движения. Для каждого автомата \(A_{i,j}\) планируется найти кратчайший путь из общежития в учебный корпус, проходящий через этот автомат и содержащий как можно больше автоматов, торгующих тем же самым продуктом, что и автомат \(A_{i,j}\). Количество таких автоматов на этом пути называется избыточностью автомата \(A_{i,j}\). При этом автомат \(A_{1,1}\) находится в общежитии, а автомат \(A_{n,n}\) — в учебном корпусе.
Требуется написать программу, которая по информации о продуктах, продаваемых автоматами, для каждого из чисел в диапазоне от \(1\) до \(2n - 1\) определяет число автоматов с таким значением избыточности.
Формат входных данных
Первая строка содержит целое число \(n\) (\(2 \leqslant n \leqslant 1500\)). Следующие \(n\) строк содержат по \(n\) чисел в каждой. В \(i\)-й из этих строк \(j\)-е число соответствует номеру продукта, продающегося в автомате \(A_{i,j}\). Номера продуктов находятся в диапазоне от \(1\) до \(n^2\).
Формат выходных данных
Строка должна содержать \((2n-1)\) целых чисел — количество автоматов с избыточностями \(1, 2, \ldots, 2n - 1\) соответственно.
| |
|
|
Глеб и медиана
Дерево отрезков, RSQ, RMQ
реализация
Глеб устал от побитового исключающего <<или>> и решил, что пора найти новую интересную функцию. Его выбор пал на медиану. Напомним, медианой массива называется число, которое окажется посередине, если массив упорядочить по возрастанию. В рамках этой задачи для массивов чётной длины положим медиану равной левому из двух центральных в отсортированном порядке элементов.
Для некоторого числа \(m\) назовём \(m\)-разбиением массива такое его разбиение на непересекающиеся отрезки, что на каждом из этих отрезков медиана больше либо равна \(m\). Вам дан массив \(a\) длины \(n\) и \(q\) запросов двух видов:
-
присвоить элементу с индексом \(i\) значение \(x\);
-
найти наибольшее число \(k\) такое, что для подотрезка массива с индексами от \(l\) до \(r\) существует \(m\)-разбиение на \(k\) отрезков.
Формат входных данных
В первой строке дается число \(n\) (\(1 \le n \le 2 \cdot 10^5\)) - размер массива. В следующей строке вводятся \(n\) чисел \(a_{i}\) (\(1 \le a_{i} \le 10^9\)) - элементы массива, на следующей строке вводится число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) - количество запросов. В следующих \(q\) строках даются запросы, каждый в одном из следующих форматов:
-
\(1\) \(i\) \(x\) — запрос 1 типа (\(1 \le i \le n, 1 \le x \le 10^9\));
-
\(2\) \(m\) \(l\) \(r\) — запрос 2 типа (\(1 \le m \le 10^9, 1 \le l \le r \le n\)).
Формат выходных данных
Для каждого запроса второго типа в отдельной строке выведите ответ на запрос. В случае если для отрезка не существует никакого \(m\)-разбиения, выведите \(0\).
В задаче присутствуют 6 групп:
-
\(n \le 5, q \le 5\), такие решения будут набирать не менее 10% баллов
-
\(n \le 100, q \le 100\), такие решения будут набирать не менее 20% баллов
-
\(n \le 10000, q \le 10000\), такие решения будут набирать не менее 30% баллов
-
\(m\) - одно и тоже для всех запросов, такие решения будут набирать не менее 25% баллов
-
нет запросов изменения, такие решения будут набирать не менее 35% баллов
-
Ограничения, как и в задаче
| |
|
|
Дек
Дерево отрезков, RSQ, RMQ
Есть шарики, пронумерованные от \(1\) до \(n\). Также поступают \(q\) запросов:
-
\(add\) \(x\) - добавить в дек шарик с номером \(x\). Вы можете положить шарик либо сверху, либо снизу дека.
-
\(del\) \(x\) - удалить из дека шарик с номером \(x\). Вы находите шарик с номером \(x\) в деке, достаете все шарики НИЖЕ \(x\), удаляете шарик \(x\), потом кладете достанные шарики (без \(x\)) обратно в том же порядке.
На запросы \(1\)-го типа вы тратите \(1\) действие, а на запросы \(2\)-го типа - \(2k + 1\) действий, где \(k\) - количество шариков, которые лежат ниже удаляемого (то есть вы сначала достаете \(k\) шариков, потом удаляете нижний, потом кладете достанные \(k\) шариков обратно в том же порядке).
Посчитайте, какое минимальное количество действий вы можете потратить.
Формат входных данных
Первая строка содержит числа \(n\) и \(q\) (\(1 \leq n, q \leq 2 \cdot 10^5\)) - максимальный номер шарика и количество запросов. Далее следуют \(q\) строк в формате:
Гарантируется, что никакой шарик не добавляется 2 раза, а также, что если есть запрос удаления шарика \(x\), то он присутствует в деке в данный момент.
Формат выходных данных
Выведите единственное число - минимальное количество операций, которое вы можете потратить на запросы.
Замечание
В тесте 1 независимо от того, как вы добавите шарики, вы потратите 4 действия (на удаление и на добавление каждого из шариков).
В тесте 2 вам необходимо добавить шарик 5 вниз, шарик 8 вверх, шарик 1 вниз, шарик 4 вверх, тогда вы потратите ровно 6 действий.
| |
|
|
Смешивание напитков
Бинарный поиск по ответу
Дерево отрезков, RSQ, RMQ
Вывод формулы
После тяжелого контеста бывает полезно выпить немного кофе. У настоящих программистов есть множество различных сортов кофе, которые постепенно добавляются в одну кружку. При этом мы будем рассматривать кофе с определенной особенностью: разные сорта кофе держатся в кружке <<слоями>> и не перемешиваются.
Напиток из таких сортов кофе можно описать следующим образом: всего в кружку налито \(n\) сортов, \(i\)-й сорт характеризуется уровнем крепости \(p_i\) и высотой слоя, который он занимает в кружке, \(h_i\). При этом если \(i < j\), то слой кофе \(i\)-го сорта находится ниже кофе \(j\)-го сорта. Также известно, что высота кружки равна \(\sum\limits_{i=1}^n h_i\), то есть верхний край самого верхнего слоя кофе находится ровно на уровне верхней границы кружки.
Для разнообразия иногда хочется получить из такого <<коктейля>> напиток определенного суммарного уровня крепости. Суммарный уровень крепости определяется как среднее взвешенное уровней налитых в кружку сортов, то есть как \[P = \frac{\sum\limits_{i=1}^n p_i \cdot h_i}{\sum\limits_{i=1}^n h_i} \text{.}\]
Чтобы как-то изменять \(P\), можно
-
выбрать трубочку произвольной высоты \(h\);
-
один или более раз выполнить следующее: погрузить ее в напиток на любую глубину от \(0\) до \(h\) включительно относительно верхнего края кружки (не относительно текущего уровня жидкости) и отпить произвольное (не обязательно целое) количество кофе с того уровня, на который попал нижний конец трубочки.
При выпивании какого-то количества кофе из одного слоя высота этого слоя уменьшается на соответствующую величину, а все верхние слои опускаются на ту же величину вниз.
Ваша задача — ответить на запросы вида: можно ли из текущего напитка сделать напиток крепости \(t_i\), и если можно, то какая минимальная высота трубочки для этого понадобится. Поскольку идеально точную необходимую высоту трубочки вычислить может быть сложно, достаточно определить минимальное количество верхних слоев кофе, достаточное, чтобы, отпив какое-то количество кофе из некоторых из них, можно было добиться суммарной крепости напитка \(t_i\).
Формат входных данных
В первой строке ввода даны два целых числа \(n\) и \(q\) — количество слоев кофе в кружке и количество запросов (\(1 \le n, q \le 2 \cdot 10^5\)).
Следующие \(n\) строк содержат по два целых числа \(p_i\) и \(h_i\) — уровень крепости и высоту \(i\)-го снизу кружки слоя кофе (\(1 \le p_i, h_i \le 10^9\)). Гарантируется, что сумма \(p_i \cdot h_i\) по всем \(i\) не превосходит \(10^{18}\).
В \(i\)-й из следующих \(q\) строк дано единственное целое число \(t_i\), определяющее \(i\)-й запрос (\(1 \le t_i \le 10^9\)).
Формат выходных данных
Выведите \(q\) строк, в \(i\)-й из которых содержится единственное целое число от \(0\) до \(n\) — ответ \(i\)-й запрос. Если для какого-то запроса ответ такой, что нельзя добиться требуемого уровня крепости, выведите в качестве ответа на этот запрос число \(-1\).
Замечание
Для примера из условия:
-
В первом запросе, чтобы получить напиток крепости \(1\), достаточно выпить верхние два слоя кофе.
-
Во втором запросе достаточно выпить часть кофе со второго сверху слоя.
-
В третьем запросе понадобится выпить первый и третий слой кофе.
-
В четвертом запросе невозможно добиться уровня крепости \(4\).
| |
|
|
Необычный массив
Дерево отрезков, RSQ, RMQ
Использование сортировки
реализация
У Васи есть массив, состоящий из \(n\) чисел \(a_1, a_2, \ldots, a_n\). Для каждой позиции \(i\) и для каждого подотрезка массива \([l, r]\), который содержит позицию \(i\) (то есть, \(1 \le l \le i \le r \le n\)), Вася вычисляет значение \(c_{i, l, r}\) следующим образом. Вася выписывает на листочек числа из массива с позиции \(l\) до позицию \(r\), всего \(len=r-l+1\) чисел (среди которых обязательно есть \(a_i\)), и сортирует выписанные числа по возрастанию. После чего Вася находит, на какой позиции \(j\) в полученном отсортированном массиве стоит число \(a_i\). Если таких позиций несколько, то среди них он выбирает ту, которая максимизирует расстояние от середины массива — позиции \(mid = \lceil (len+1) / 2 \rceil\) (\(len / 2 + 1\) в случае четного \(len\) и \((len+1)/2\) в случае нечетного \(len\)). Полученное расстояние \(|j - mid|\) и есть искомая величина \(c_{i,l,r}\).
Например, если у Васи был массив \(a=\{5,1,3,2,1,7\}\), а \(i=2\), \(l=2\), \(r=5\), то Вася выпишет на листочек числа \(\{1,3,2,1\}\), отсортирует их и получит массив \(\{1,1,2,3\}\), длина которого равна 4. Середина этого массива находится на позиции \(4/2+1=3\), а искомое число \(a_i=1\) стоит в этом массиве на позициях 1 и 2. Среди этих двух позиций Вася выбирает ту, которая дальше от середины, то есть, позицию 1. Искомая разность между позициями равна 2, и это и есть значение \(c_{2,2,5}\).
Для каждой позиции \(i\) Вася вычисляет величину \(b_i\), которая равна максимуму среди значений \(c_{i,l,r}\) среди всех подотрезков, содержащих позицию \(i\).
Как вы видите, определение числа \(b_i\) достаточно сложное. Помогите Васе вычислить значения \(b_i\) для всех позиций массива.
Формат входных данных
В первой строке входных данных находится одно целое число \(n\) (\(1 \le n \le 200\,000\)) — размер массива Васи.
Во второй строке находится \(n\) целых чисел \(a_1, a_2, \ldots, a_n\) (\(1 \le a_i \le n\)) — элементы массива.
Формат выходных данных
В единственной строке выведите \(n\) чисел, \(i\)-е из них должно быть равно \(b_i\).
Примечание
Разберем подробнее первый пример.
-
Для первой позиции Вася рассмотрит все подотрезки, содержащие эту позицию, в частности, подотрезок \([1,5]\), где \(l=1\) и \(r=5\). Для вычисления \(c_{i,l,r}=c_{1,1,5}\) Вася выпишет числа \(\{5, 4, 3, 2, 1\}\) и после сортировки получит \(\{1, 2, 3, 4, 5\}\). Середина этого массива находится на позиции 3, а искомое число \(a_1=5\) — на позиции 5. Таким образом, \(c_{1,1,5}=2\). Нетрудно заметить, что это число — максимальное среди всех подотрезков, содержащих позицию 1, а значит, \(b_1=2\).
-
\(b_2=c_{2,2,4}\).
-
\(b_3=c_{3,3,5}\).
-
\(b_4=c_{4,1,4}\). Действительно, если выписать числа на подотрезке \([1,4]\), то получится массив \(\{5,4,3,2\}\), который после сортировки превратится в \(\{2,3,4,5\}\). Середина этого массива находится на позиции \(3\), а искомый элемент \(a_4=2\) — на позиции 1. Таким образом, \(c_{4,1,4}=2\).
-
\(b_5=c_{5,1,5}\).
| |
|
|
Караваны и Провинции
Дерево отрезков, RSQ, RMQ
Деревья
графы
Далекая страна содержит \(n\) городов, соединенных \(n - 1\) дорогами, при этом из любого города можно добраться до любого другого по дорогам страны.
Известно, что каждый город относится ровно к одной провинции. Город \(v\) относится к провинции \(t_v\). Обратите внимание, что конкретная провинция может являться любым подмножеством городов, и возможно из одного города провинции нельзя добраться до другого этой же провинции, проходя только через города этой провинции. Столицей является город номер \(1\).
Банда разбойников собирается грабить караваны, которые будут идти через города страны. У каждого города есть коэффициент того, насколько удобно в нем грабить. В городе \(v\) он равен \(c_v\).
Вам приходят запросы двух типов:
-
Изменить провинцию, к которой относится город \(v\), на \(t_{new}\)
-
В \(k\) городах с номерами \(a_1, a_2, \ldots, a_k\) появляется по одному каравану, которые идут в столицу (город с номером 1) по кратчайшему пути. Разбойники выбирают один город, который находится в провинции \(t\), после чего грабят все караваны, которые пройдут через этот город. Если разбойники ограбят караваны в городе с номером \(v\), то они получат \(c_v \cdot num_v\), где \(c_v\) — коэффициент города \(v\), а \(num_v\) это количество караванов, проходящих через этот город.
Определите максимальный ущерб, равный количеству награбленного разбойниками, для каждого запроса второго типа. Если в провинции, указанной в запросе, нет ни одного города, то ответ на этот запрос равен \(0\).
Формат входных данных
В первой строке даны два целых числа \(n\) и \(q\) (\(2 \le n \le 200\,000, 1 \le q \le 200\,000\)) — количество городов и количество запросов.
Во второй строке дано \(n - 1\) целое число \(p_2, p_3, \ldots, p_n\) (\(1 \le p_i < i\)), где число \(p_i\) означает, что существует дорога между городами \(i\) и \(p_i\).
В третьей строке дано \(n\) целых чисел \(t_1, t_2, \ldots, t_n\) (\(1 \le t_i \le n\)) — номера провинций у городов.
В четвертой строке дано \(n\) целых чисел \(c_1, c_2, \ldots, c_n\) (\(1 \le c_i \le 10^9\)) — коэффициенты успешности грабежа.
Далее идет \(q\) строк описаний запросов. В начале каждой строки дано одно целое число \(x_i\) (\(1 \le x_i \le 2\)) — тип запроса.
-
Если \(x_i = 1\), то далее идет два целых числа \(v\) и \(t_{new}\) (\(1 \le v, t_{new} \le n\)) — номер города, у которого меняется провинция, и номер его новой провинции.
-
Если \(x_i = 2\), то далее идут целые числа \(t\) и \(k\), и \(k\) целых чисел \(a_1, a_2, \ldots, a_k\) (\(1 \le t, k, a_i \le n\)) — номер провинции, в городе которой можно грабить; количество городов, из которых выходят караваны; и номера городов, из которых входят караваны. Гарантируется, что в одном запросе все \(a_i\) различны. Также гарантируется, что сумма \(k\) по всем запросам второго типа не превышает \(200\,000\).
Формат выходных данных
На каждый запрос второго типа выведите одно число — максимальное число, которое разбойники смогут получить. Если в провинции, указанной в запросе, нет ни одного города, то ответ на этот запрос равен \(0\).
Примечание
В первом запросе караваны идут из городов с номерами \(3\) и \(4\) и нужно ограбить их в городе из третьей провинции. Это те же самые города с номерами \(3\) и \(4\), через каждый из которых пройдет по одному каравану. Поэтому разбойники ограбят караваны в третьем городе и получат \(c_3 \cdot 1 = 10 \cdot 1 = 10\).
Во втором запросе караваны также идут из городов с номерами \(3\) и \(4\), но теперь нужно ограбить их в городе из первой провинции. В первой провинции находятся города \(1\) и \(2\), через каждый из которых пройдет два каравана. Среди них разбойники выбирают город \(2\), потому что \(c_2 > c_1\) и ответ на этот запрос равен \(c_2 \cdot 2 = 3 \cdot 2 = 6\).
В третьем провинция для города \(3\) изменяется на \(1\).
В четвертом запросе караваны снова идут из городов с номерами \(3\) и \(4\), и нужно ограбить караваны в городе из первой провинции. То есть разбойники могут ограбить караваны в одном из городов с номерами \(1, 2\) или \(3\). Через города с номерами \(1\) и \(2\) пройдет два каравана, а через город \(3\) только один. Разбойникам выгодно ограбить караваны в городе \(3\) и получить \(c_3 \cdot 1 = 10 \cdot 1 = 10\).
| |
|
|
Обходы бинарного дерева
Дерево отрезков, RSQ, RMQ
Деревья
Бинарное дерево — это набор вершин, у каждой из которых может быть левый и правый ребёнок. Одна из вершин является корнем дерева, она не является ребёнком какой-то другой. Начав в корне и каждый раз переходя в одного из детей, можно дойти до любой вершины. Множество вершин, до которых можно дойти из заданной, называется её поддеревом.
У бинарного дерева есть три основных обхода: прямой (pre-order), центрированный (in-order) и обратный (post-order).
Прямой обход дерева — это порядок его вершин, полученный следующим рекурсивным алгоритмом:
-
Добавить корень дерева в обход.
-
Если у корня есть левый ребёнок, выписать прямой обход его поддерева.
-
Если у корня есть правый ребёнок, выписать прямой обход его поддерева.
В центрированном обходе корень дерева выписывается между обходами поддеревьев его детей, в обратном — после обходов поддеревьев его детей.
Обобщим эти три варианта обхода: пусть в каждой вершине записано целое число \(x\) от \(-1\) до \(1\), обозначающее, в какой момент мы выписываем эту вершину, а именно:
-
\(x = -1\): до обходов поддеревьев её детей;
-
\(x = 0\): между обходами поддеревьев её детей;
-
\(x = 1\): после обходов поддеревьев её детей.
Таким образом, если во всех вершинах записано \(-1\), обход является прямым, если \(0\) — центрированным, если \(1\) — обратным.
Рассмотрим дерево с \(n\) вершинами, пронумерованных от \(1\) до \(n\). Корень дерева — вершина \(1\). Изначально во всех вершинах записано число \(-1\).
В рамках исследования необходимо обработать \(q\) запросов одного из следующих типов:
-
Поменять числа в вершинах \(l, l+1, \dots, r\) на \(x\) (\(x\) равен \(-1\), \(0\) или \(1\)).
-
Сообщить, на какой позиции в текущем обходе будет стоять вершина \(i\).
Необходимо вывести ответы на все запросы второго типа.
В первой строке входных данных даны два целых числа \(n\) и \(q\) (\(1 \le n, q \le 100\,000\)).
В следующих \(n\) строках даны по два целых числа \(L_i\) и \(R_i\) (\(0 \le L_i, R_i \le n\)) — номер левого и правого ребёнка вершины \(i\) соответственно, либо \(0\), если соответствующий ребёнок отсутствует.
Гарантируется, что \(L_i\) и \(R_i\) задают корректное бинарное дерево.
Формат входных данных
В следующих \(q\) строках даны запросы. Первое число в строке \(t\) (\(t \in \{1, 2\}\)) — тип запроса.
В случае запроса первого типа далее даны целые числа \(l\), \(r\) и \(x\) (\(1 \le l \le r \le n\), \(x\) равен \(-1\), \(0\) или \(1\)) — границы отрезка вершин, в которых меняются числа, и новое значение.
В случае запроса второго типа далее дано число \(i\) (\(1 \le i \le n\)) — номер вершины, позицию которой в обходе необходимо вывести.
Формат выходных данных
На каждый запрос второго типа выведите единственное число от \(1\) до \(n\) — позицию соответствующей вершины в обходе.
Пусть \(q_1\) — количество запросов первого типа.
В примере обход меняется следующим образом:
-
\([1, 3, 5, 2, 4]\)
-
\([5, 2, 3, 4, 1]\)
-
\([5, 3, 2, 4, 1]\)
| |
|
|
Работа в Снежинске
sqrt декомпозиция
Дерево отрезков, RSQ, RMQ
Коренной житель Снежинска Даня Багров уже подрос, и пришло время найти работу. Конечно же, Даня захотел устроиться на завод.
Так как большинство заводов расположены в Челябинске (там их более 60), Снежинску достался всего один, и, соответственно, спрос на такое желаемое место работы очень высок в этом городе, поэтому при устройстве на завод в Снежинске все сотрудники в обязательном порядке должны решить задачу по программированию.
Даня прогуливал в детстве информатику, поэтому с программированием у него всё плохо. Помогите Дане решить задачку, чтобы он смог без проблем устроиться на завод и жить в достатке.
Дано два массива целых чисел a1,a2,...,an и b1,b2,...,bn и q запросов двух типов:
• 1 l r x — нужно сделать ai = x для всех l <= i <= r.
• 2 l r — нужно найти минимальное значение \( {lcm (a_i,b_i)\over gcd(a_i,b_i)}\) по всем l <= i <= r.
Входные данные
В первой строке находятся два целых числа n и q (1 <= n,q <= 5 · 104) — количество чисел в массивах a и b и количество запросов.
Во второй строке находятся n целых чисел a1,a2,...,an (1 <= ai <= 5 · 104).
В третьей строке находятся n целых чисел b1,b2,...,bn (1 <= bi <=5 · 104).
Далее следует q строк, j-я из которых начинается с целого числа t (1 <= t <= 2) и означает, что j-й запрос относится к типу t.
Если t =1, то остальная часть строки содержит целые числа l, r и x (1 <= l <= r <= n, 1 <= x <= 5·104). Если t =2, то остальная часть строки содержит целые числа l и r (1 <= l <= r <= n).
Выходные данные
Для каждого запроса второго типа выведите ответ на задачу. Гарантируется, что хотя бы один такой запрос будет.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10 10
6 10 15 4 9 25 2 3 5 30
1 2 3 4 6 9 12 15 18 30
2 1 10
1 7 10 9
2 5 10
1 1 6 14
2 4 7
2 3 9
1 2 9 30
2 1 4
2 3 7
2 5 10 |
1
2
12
2
10
5
2 |
| |
|
|
Шахматные баталии
Дерево отрезков, RSQ, RMQ
Ильдар и Ваня устали постоянно играть в шахматы, поэтому они придумали новую шахматную игру.
Игра происходит на шахматном поле размером 2n×2m. Это поле имеет 2n строк и 2m столбцов. Для удобства будем обозначать как (i, j) клетку поля, которая находится в i-й строке и j-м столбце. Клетки этого поля покрашены в черный и белый цвета шахматной раскраской. Более точно, клетка (i, j) имеет белый цвет, если i + j чётно, и чёрный цвет в противном случае.
Игра устроена следующим образом. Ильдар вырезает некоторые белые клетки поля. После этого он предлагает Ване попробовать решить следующую задачу: может ли он на не вырезанных белых клетках поля расставить nm шахматных королей так, что никакие два выставленных короля не бьют друг друга, то есть не стоят на клетках поля, соседних по стороне или углу.
Конечно, Ильдар планирует сделать игру интересной и выставить несколько непростых для Вани комбинаций вырезанных клеток. Для этого он попросил у вас помощи. Чтобы перед игрой понять, как лучше всего действовать, он хочет потренироваться. Для этого, он берёт пустое поле и хочет q раз либо вырезать какую-то белую клетку, либо вернуть на поле какую-то ранее вырезанную клетку. После каждого изменения он бы хотел знать, каким будет ответ на задачу для Вани.
Помогите Ильдару сделать игру интересной! Напишите программу, которая будет отвечать на его запросы.
Формат входных данных
В первой строке находится три целых числа n, m, q (1 ≤ n, m, q ≤ 200 000) — количество пар строк шахматной доски, количество пар столбцов шахматной доски и количество запросов.
Следующие q строк описывают запросы Ильдара. Каждая из этих строк содержит два целых числа i, j (1 ≤ i ≤ 2n, 1 ≤ j ≤ 2m, i+j четно). Если клетка (i, j) не вырезана, то Ильдар её вырезает, иначе он возвращает её обратно на поле.
Формат выходных данных
Выведите q строк. В i-й из этих строк выведите ответ на задачу для доски, полученной после i первых запросов Ильдара.
Выведите «YES» (без кавычек), если Ваня может так расставить шахматных королей на не вырезанные белые клетки поля, что никакие два короля не будут бить друг друга. Иначе выведете «NO» (без кавычек).
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
1 3 3
1 1
1 5
2 4 |
YES
YES
NO |
| 2 |
3 2 10
4 2
6 4
1 3
4 2
6 4
2 2
2 4
1 3
4 4
3 1 |
YES
YES
NO
NO
YES
YES
NO
YES
YES
NO |
Замечание
В первом примере, после второго запроса будут вырезаны клетки (1, 1) и (1, 5). Тогда Ваня может поставить три короля на клетки (2, 2), (2, 4) и (2, 6).
После третьего запроса будут вырезаны клетки (1, 1), (1, 5) и (2, 4). Тогда остаётся всего три пустые клетки (2, 2), (1, 3) и (2, 6). Ваня не может поставить трех королей на эти клетки, потому что короли в клетках (2, 2) и (1, 3) бьют друг друга, так как эти клетки соседние по углу.
| |
|
|
Поезд
Дерево отрезков, RSQ, RMQ
Вам дан массив целочисленных чисел размера n.Необходимо реализовать структуру данных,которая могла бы исполнять следующие операции:
1)Прибавлять всем числам на отрезке [l;r] величину d.
2)Получить сумму чисел на отрезке [l;r].
3)Получить минимум из чисел на отрезке [l;r].
INPUT
На ввод приходит число n – размер массива.В следующей строке,через пробел, даны n чисел - ai.
Далее задается число m - количество запросов.В следующих m строках запросы трех видов:
1)add l r d - прибавление на отрезке [l;r] числа d.
3)rsq l r - запрос суммы на отрезке [l;r].
3)rmq l r - запрос минимума на отрезке [l;r].
OUTPUT
Ответы для запросов второго и третьего типов через пробел.
P.S. 0 < n, m < 100001 ai < 1000000001.
P.S.S. Гарантируется,что ответ вмещается в 64-битный тип данных.
INPUT
5
1 2 3 4 5
3
rsq 1 5
add 2 3 1
rmq 2 4
OUTPUT
15 3
(с) Никита Максимов, 2017г.
| |
|
|
Украшение ёлки – 2
Дерево отрезков, RSQ, RMQ
Префиксные суммы(минимумы, ...)
И вот вновь наступил Новый Год, и Васе снова понадобилось наряжать ёлку. Но, памятуя о своих прошлогодних неудачах (Вы о них знаете, если решали прошлогодний контест), он купил в магазине брендовые ударопрочные шарики. К сожалению, на ёлку в результате денег почти не осталось, и её пришлось покупать у какого-то индуса. Поэтому ёлка имеет форму полного двоичного дерева глубины N – на верхушке только одна ветка, и под каждой веткой, кроме самых нижних, снизу растёт ровно две. В самом низу, соответственно, под ветками только Васин немытый пол.
Но когда Вася приступил к украшению, он понял, что совершил страшную ошибку. Ударопрочные шарики были одноцветными и скучными, поэтому Вася не мог развесить их как попало, как он делал это раньше. Пришлось ему разрабатывать алгоритм украшения. Для начала он соотнёс каждому цвету его индекскрасоты – параметр от 0 до 109. Чем он больше, тем более красивым кажется Васе шар этого цвета. Потом он случайным образом развесил шарики у пола (на каждую ветку Вася всегда вешает только один шар). Для всех остальных веток Вася смотрел на их нижних соседей, определял, какой из висящих на этих ветках шариков красивее, и вешал на эту ветку точно такой же.
Когда это муторное дело было наконец завершено, он посмотрел на ёлку и понял, что неудачно выбрал нижние шарики. Но Вася от этой мороки с шариками уже почти пропустил свой любимый новогодний сериал, поэтому попросил Вас помочь ему закончить украшение побыстрее.
Нижние ветви пронумерованы от 1 до 2^(N- 1), более верхним Вася из лени решил номера не давать. Вася подаёт на вход два вида запросов. В первом он заменяет какой-либо шар в нижнем уровне с номером k на шар цвета c, и хочет узнать, на скольких слоях веток (кроме нижнего) ему придётся перевесить шары, чтобы ёлка по-прежнему подходила под описанный выше алгоритм. Во втором он хочет узнать цвет самого красивого шара в секторе от l до r. К сектору относятся все ветки нижнего слоя с номерами от l до r включительно, а также все находящиеся над ними ветки.То есть, если N = 3, то к секторуот 1 до 2 относятся ветки 1 и 2, а также третья ветка, находящаяся между ними чуть выше.
Формат ввода
В первой строке задана глубина ёлки N (N<= 15) и количество запросов M (M<= 107). Во второй строке задана первоначальная развеска нижних шариков, представленная их индексами красоты. В следующих M строках заданы запросыдвух типов (первый обозначен цифрой 1, а второй, как ни странно, 3). Описание запросов дано выше.
Формат вывода
Нужно вывести Mстрок, содержащих ответы на запросы.
Пример
Ввод:
4 5
1 1 2 3 100 7 11 3
3 1 8
3 2 4
1 5 4
3 1 8
1 5 9
Вывод:
100
3
3
11
1
(c) Даниил Кирионенко, 9и
| |
|
|
Assault
Дерево отрезков, RSQ, RMQ
Префиксные суммы(минимумы, ...)
В то время, пока обороняющиеся отвлеклись на Блейза, Корвин начал штурм города. Для того, чтобы его армия вошла в город, ему нужно пробить брешь в стене. В его распоряжении есть целый флот, из которого он собирается обстреливать стены города. Стена являются линией из n сегментов, пронумерованных от 1 до n.
Корвин хорошо помнит, насколько укреплен каждый сегмент стены. К сожалению, с тех пор как Корвин последний раз был в Амбере, сегменты несколько раз перестраивали, поэтому их укрепленность могла измениться, поэтому Корвин владеет устаревшей информацией.
Но Джерард не только согласился отвести свой флот из бухты Амбера, благодаря чему флоту Корвина удалось добраться до Амбера с целым и невредимым флотом, но и предоставил ему журнал с m записями, в котором в i-ой записи указано, что были перестроены сегменты с li по ri, а также сказано, насколько изменилась укрепленность всех сегментов (укрепленность каждого сегмента на отрезке [li; ri] изменяется на одно и тоже значение ti).
Корвин m раз предлагает выстрелить по сегментам стены с l по r из p кораблей. Известно, что брешь будет пробита, если на отрезке [l; r] есть хотя бы один сегмент с укрепленностью меньше p. Вы должны ответить ему, будет ли пробита брешь (вывести " YES"), или нет (вывести " NO").
Входные данные
На первой строке находятся числа n, m и k (1 <= n, k <= 100000, 1 <= m <= 10000) - количество сегментов, записей и запросов от Корвина соответственно.
На второй строке находятся числа a1,..., an (0 <= ai <= 10).
В следующих m строках содержатся числа l, r, t (1 <= l <= r <= n, -10 <= t <= 10).
В следующих k строках содержатся числа l, r, p (1 <= l <= r <= n, 1 <= p <= 1000).
Выходные данные
В i-ой строке выведите ответ на i-ый запрос Корвина.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10 3 3
123 398 287 190 76 15 407 312 323 659
4 9 -99
10 10 -82
4 10 76
9 10 32
5 6 283
4 4 983
|
NO
YES
YES
|
| |
|
|
Siege
Дерево отрезков, RSQ, RMQ
Блейз был готов войти в Амбер, но армия Джулиана начала обстреливать его армию со стен города. Блейз не глуп и понимает, что пока армия Джулиана обстреливает его солдат, у них не получится собрать осадные орудия, поэтому надо уничтожить защитников стен.
Блейз и Джулиан строят свои отряды стрелков в линии и дают каждому отряду номер от 1 до n. У каждого отряда есть своя сила, которая выражается некоторым натуральным числом.
Напротив отряда Джулиана с номером i стоит отряд Блейза с номером i. Далее следует m приказов:
Джулиан приказывает отрядам с номерами от l1 до r1 дать залп по стоящим напротив них отрядам Блейза.
В то время, пока стрелки Джулиана перезаряжаются, Блейз приказывает отрядам с номерами от l2 до r2 дать залп по стоящим напротив стрелкам Джулиана.
После этого все повторяется: Джулиан дает залп, Блейз дает залп и т.д.
Сила залпа и защита вычисляются как сумма сил солдат на отрезке [l; r]. Если сила залпа оказывается выше защиты, то все защищающиеся отряды уничтожаются и больше не могут стрелять (их сила больше не учитывается при подсчете защиты и силы залпа).
Вам даны приказы командиров. Ваша задача узнать, чья армия победила. Победившей считается армия, которая после последнего приказа может уничтожить армию противника, т.е. сила залпа на отрезке [1; n] победившей армии больше, чем защита проигравшей армии на отрезке [1; n].
Если победил Блейз, то выведите "Bleys" (без кавычек).
Иначе выведите " Julian" (без кавычек). Также выведите разницу между силой залпа победившей армии и защитой проигравшей.
Входные данные
В первой строке находятся числа n и m (1 <= n, m <= 100000) - количество отрядов у Блейза и Джулиана и количество отданных приказов.
Во второй строке находятся n чисел a1, a2, ..., an (1 <= ai <= 1000) - сила отрядов Джулиана.
В третьей строке находятся n чисел b1, b2, ..., bn (1 <= bi <= 1000) - сила отрядов Блейза.
В следующих m строках находятся числа l и r (1 <= l <= r <= n) - отданные приказы.
Выходные данные
Выведите " Bleys", если победил Блейз. Иначе выведите " Julian". Также выведите число - разницу между силой залпа и защитой.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10 3
2 2 4 9 1 8 6 1 8 8
1 1 8 9 3 6 5 1 8 6
5 9
1 6
9 10
|
Julian 30 |
| |
|
|
Дерево отрезков
Дерево отрезков, RSQ, RMQ
Корвин и Блейз готовятся ко вторжению в Амбер, чтобы свергнуть Эрика. Для этого им нужно собрать армию. В мире, где они находятся есть n поселений, расположенных в линию из-за особенностей местности. Известно, что в первом поселении есть a1 воинов, во втором - a2, в i-ом - ai, в n-ом - an.
Иногда Корвин и Блейз узнают, что в ai поселении иное количество воинов, чем предполагалось. Корвин и Блейз спрашивают вас m раз, какое максимальное количество воинов, имеющееся в каком-либо поселении может предоставить наибольшее число воинов. Помогите им определить это.
Входные данные
В первой строке на вход подаются числа n и m (1 <= n, m <= 100000) - число поселений и число запросов.
Во второй строке находятся n чисел a1, a2, ..., an (1 <= ai <= 1000) - количество воинов в поселениях.
В следующих m строках находятся числа t, l и r (1 <= l <= r <= n), (0 <= t <= 1) - если t равно 0, то l и r - границы запросов. Иначе l - номер города, а r - новая информация.
Выходные данные
На i-той строке выведите ответ на i-тый запрос, если ti=0, иначе выведите " -1".
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
5 3
1 2 3 4 5
0 1 5
1 3 6
0 1 5
|
5
-1
6
|
| |
|
|
What's this
Дерево отрезков, RSQ, RMQ
Деревья
графы
What’s this
После посадки на Марс учёные нашли странную систему пещер, соединённых туннелями. И учёные начали исследовать эту систему, используя управляемых роботов. Было обнаружено, что существует ровно один путь между каждой парой пещер. Но потом учёные обнаружили специфическую проблему. Иногда в пещерах происходят небольшие взрывы. Они вызывают выброс радиоактивных изотопов и увеличивают уровень радиации в пещере. К сожалению, роботы плохо выдерживают радиацию. Но для исследования они должны переместиться из одной пещеры в другую. Учёные поместили в каждую пещеру сенсор для мониторинга уровня радиации. Теперь они каждый раз при движении робота хотят знать максимальный уровень радиации, с которым придётся столкнуться роботу во время его перемещения. Как вы уже догадались, программу, которая это делает, будете писать вы.
Формат входных данных
Первая строка содержит одно целое число N (1≤ N ≤ 100000) — количество пещер. Следующие N −1 строк описывают туннели. Каждая из этих строк содержит два целых числа — ai и bi (1 ≤ ai,bi ≤ N), описывыющие туннель из пещеры с номером ai в пещеру с номером bi. Следующая строка содержит целое число Q (1 ≤ Q ≤ 100000), означающее количество запросов. Далее идут Q запросов, по одному на строку. Каждый запрос имеет вид «C U V », где C — символ «I» либо «G», означающие тип запроса (кавычки только для ясности). В случае запроса «I» уровень радиации в U-й пещере (1 ≤ U ≤ N) увеличивается на V (0 ≤ V ≤ 10000). В случае запроса «G» ваша программа должна вывести максимальный уровень радиации на пути между пещерами с номерами U и V (1≤ U,V ≤ N) после всех
увеличений радиации (запросов «I»), указанных ранее. Предполагается, что изначальный уровень радиации равен 0 во всех пещерах, и он никогда не уменьшается со временем (потому что период полураспада изотопов много больше времени наблюдения).
Формат выходных данных
Для каждого запроса «G» выведите одну строкусодержащую максимальный уровень радиации
| |
|