# Содержание

Содержание;
Общая концепция листка;
Что почитать по теме;
Предподсчёт на всех префиксов;
A: Суммы на префиксе;
B: Суммы на подотрезках;
C: Произведение на подотрезках;
D: Суммы на подпрямоугольнике;
Изменения;
E: Суммы на подотрезках с единичным изменением;
F: Произведение на подотрезках с единичным изменением;
G: Суммы на подотрезках с изменением на отрезке;
Хранение дополнительной информации в декомпозиции;
H: Количество чисел меньших kk с инкрементом на отрезке;
I: K-я порядковая статистика на отрезке с изменением на отрезке;
Корневая не как структура;
Корневая декомпозиция на графах;
J: Покраска вершин;
K: Количество соседних цветов;
L: Количество циклов длины 3;
M: Очень простая сумма;
Корневая декомпозиция на строках;
Разбиение на тяжелые и легкие ;
Количество разных длин ;
N: Substring query;
Корневая декомпозиция на запросах;
O: Винни Пух и бочки меда;
Алгоритм Мо;
P: Мощные юнги;
Q: Инверсии на отрезке;
Мо на дереве;
R: MEX на пути в дереве;
3Д Мо;
S: Дима и массив;
T: Машинное обучение;

# Общая концепция листка

В этом листке почти во всех задачах такой сюжет: есть массив данных, организованных в одномерный/двумерный массив или граф. И есть набор запросов, который предполагает вычисление некоторой функции на отрезке/прямоугольнике. В худшем случае возможно ещё и изменение данных.

# Что почитать по теме

# Предподсчёт на всех префиксов

Часто функция обладает таким полезным свойством: ответ множестве XX может быть легко вычислен на основе ответа на множестве XYX\cup Y и на множестве YY. Если предпосчитать достаточно богатый набор значений функции, то потом можно быстро давать ответы.

Пример такой функции — сумма всех элементов множества.

Для подобный функций бывает полезно предпосчитать её значения на всех префиксах или всех суффиксах, или на всех подпрямоугольниках с вершиной в каком-нибудь угле данных.

A: Суммы на префиксе

Дан массив AA длины NN, а также MM запросов вида ll. Для каждого запроса найдите сумму первых ll элементов массива.

4 4 1 2 3 4 1 2 3 4
1 3 6 10
IDE

B: Суммы на подотрезках

Дан массив AA длины NN, а также MM запросов вида ll rr. Нужно найди сумму элементов массива с ll по rr

4 3 1 2 3 4 1 4 2 4 2 3
10 9 5
IDE

C: Произведение на подотрезках

Дан массив AA длины NN, а также MM запросов вида ll rr. Нужно найди произведение элементов массива с ll по rr по модулю 109+710^9 + 7. Гарантируется, что в массиве нет нулей.

4 3 1 2 3 4 1 4 2 4 2 3
24 24 6
IDE

D: Суммы на подпрямоугольнике

Дан двумерный массив AA размера N×MN \times M, а также QQ запросов вида x y x1 y1x\ y\ x_1\ y_1. Нужно найди сумму элементов подмассива с левым верхним углом в (x,y)(x, y) и правым нижним (x1,y1)(x_1, y_1)

3 3 2 1 2 3 4 5 6 7 8 9 2 2 3 3 1 1 2 3
28 21
IDE

# Изменения

Вообще, идея префиксных предподсчетов довольно часто возникает в программировании, но у данного подхода есть как плюсы (например, ответ за O(1)O(1)), так и минусы, например, изменение элементов происходит за O(n)O(n), что очень долго. Научимся за не слишком медленно изменять элементы, не сильно замедлив процедуру ответа.

Идея несколько похожа на идею префиксного подсчета: давайте поделим весь массив на блоки размера kk, в каждом из которых посчитаем ответ и запишем в массив blocksblocks. Теперь научимся получать ответ. Пусть есть запрос на вычисление функции на отрезке с ll по rr. Выделим внутри этого отрезка полные блоки, и добавим их в ответ, а "хвост" обработаем руками. Суммарная ассимптотика O(n/k+k)O(n / k + k). Оказывается, самым оптимальным значением для kk есть n\sqrt n

Теперь заметим, что изменение работает за O(1)O(1). Изменив элемент и ответ в соответствующем блоке мы полностью обновим структуру.

E: Суммы на подотрезках с единичным изменением

Дан массив AA длины NN, а также MM запросов одного из 2х видов:

  1. сумма на отрезке
  2. единичное изменение
Требуется ответить на все запросы суммы на отрезке
4 3 1 2 3 4 1 1 3 2 2 10 1 1 3
6 14
IDE

F: Произведение на подотрезках с единичным изменением

Дан массив AA длины NN, а также MM запросов одного из 2х видов:

  1. произведение на отрезке по модулю 109+710^9 + 7
  2. единичное изменение

Требуется ответить на все запросы произведения на отрезке. Гарантируется, что во всех версиях массива нет нулей

4 3 1 2 3 4 1 1 3 2 2 10 1 1 3
6 30
IDE

G: Суммы на подотрезках с изменением на отрезке

Дан массив AA длины NN, а также MM запросов одного из 2х видов:

  1. сумма на отрезке
  2. инкремент на отрезке

Требуется ответить на все запросы суммы на отрезке

5 3 1 2 3 4 5 1 1 5 2 2 5 3 1 1 5
15 27
Подсказка
Да что-то непонятное тут требуют...

Храни вспомогательный массив для блоков.

Тут какая-то жесть

Давате хранить вспомогательный массив addadd длиной n\sqrt n в каждой ячейке которого будем хранить насколько суммарно мы увеличили все числа в данном блоке. Теперь обновление выглядит так: ищем "цельные" блоки, увеличиваем суммарный инкремент, а "хвост" обрабатываем руками.

IDE

# Хранение дополнительной информации в декомпозиции

Часто, бывает удобно хранить вспомогательную структуру внутри декомпозиции, например, массив инкрементов на блоках. В следующих задачах вам предстоит самим догадаться, какие именно доп.структуры надо использовать.

IDE

H: Количество чисел меньших kk с инкрементом на отрезке

Для заданного массива требуется выполнить ряд запросов. Все запросы делятся на два типа. Запрос первого типа – вычислить количество элементов массива на отрезке от l до r меньших заданного числа x. Запрос второго типа – увеличить все элементы массива на отрезке от l до r на заданное число x.

  1. 1 - найти количество чисел меньших kk и больших ll на отрезке
  2. 2 - инкремент на отрезке на величину xx

Требуется ответить на все запросы.

5 3 1 2 3 4 5 1 1 5 5 2 2 4 2 1 1 5 5
4 2
IDE

I: K-я порядковая статистика на отрезке с изменением на отрезке

Для заданного массива требуется выполнить ряд запросов. Все запросы делятся на два типа.

  1. Вычислить kk-тую порядковую статистику на отрезке с ll по rr.
  2. Увеличить все элементы массива на отрезке от ll до rr на заданное число x.
5 2 1 2 3 4 5 1 1 5 5 2 2 4 2
8
IDE

# Корневая не как структура

IDE

# Корневая декомпозиция на графах

В задачах на запросы на графах иногда работает следующий трюк: разделим вершины на "тяжелые" и "лёгкие" по следующему принципу: тяжелыми будут вершины со степенью больше или равные E\sqrt E, а легкими все остальные. Тогда для тяжелых вершин будем хранить ответ явно, а для легких будем считать ответ "ручками". Так как тяжелых вершин не больше E\sqrt E, и степень легких не больше E\sqrt E, то суммарная ассимптотика решения - O(VE)\mathcal{O}(V\sqrt E)

IDE

J: Покраска вершин

Вам дан граф с NN вершинами и MM ребрами. У каждой вершины есть свой цвет viv_i. Вам дано qq запросов в виде пары (vi,ci)(v_i, c_i), означающий, что надо перекрасить вершину viv_i в цвет cic_i. После каждого запроса нужно вывести количество ребер у которых вершины покрашены в разный цвет.

4 5 1 2 3 4 1 2 2 3 3 4 4 1 1 3 5 1 5 3 2 4 4 1 4 2 3
5 4 4 3 4
IDE

K: Количество соседних цветов

Дан неориентированный граф без петель и кратных ребер, у которого nn вершин и mm ребер. У каждой вершины есть цвет. Требуется ответить на qq запросов. Каждый запрос имеет один из двух типов:

  1. vv cc – перекрасить вершину vv в цвет cc
  2. vv – вычислить количество различных цветов у соседей вершины vv.
4 3 3 1 2 3 4 1 2 1 3 1 4 2 1 1 4 3 2 1
3 2
IDE

L: Количество циклов длины 3

Вам дан граф с NN вершинами и MM ребрами. Вам нужно найти количество циклов длины 3.

6 6 1 2 2 3 3 1 4 2 3 4 5 1
2
IDE

M: Очень простая сумма

Дано число nn до 101210^{12}, посчитайте сумму i=1nni\sum_{i=1}^n \lfloor\frac{n}{i}\rfloor

5
10
1000000000000
27785452449086
IDE

# Корневая декомпозиция на строках

# Разбиение на тяжелые и легкие

Назовем строку SS длинной, если SS|S| \ge \sqrt{\sum|S|}. Все оставшиеся строки назовем легкими.

Утверждение.\textbf{Утверждение.} Существует не более 2S2\sqrt{\sum|S|} тяжелых строк.
Доказательство.\textbf{Доказательство.} Пусть существуют более 2S2\sqrt{\sum|S|}. Тогда их суммарная длина больше, чем 2SS2=S\frac{2\sqrt{\sum{|S|}}\sqrt{\sum{|S|}}}{2} = \sum{|S|}, что противоречит условию.

# Количество разных длин

Утверждение.\textbf{Утверждение.} Существует не более O(S)\mathcal{O}(\sqrt{\sum|S|}) различных длин.
Доказательство.\textbf{Доказательство.} Пусть оно равно xx. Тогда минимально возможная сумма длин - это сумма чисел от 1 до xx. 1x=x(x+1)2\sum_{1}^{x} = \frac{x(x + 1)}{2}. Так как это число должно быть меньше, чем S\sum{|S|}, то x=O(S)x = \mathcal{O}(\sqrt{\sum{|S|}})

IDE

N: Substring query

У Пупы есть nn строк S1,S2,S3,...,SnS_1,S_2,S_3,...,S_n Однажды его друг Лупа пришёл в бухгалтерию и попросил его ответить на qq вопросов: сколько строк среди Sli,Sli+1,Sli+2,...,SrS_{l_i},S_{l_i + 1}, S_{l_i + 2},...,S{r} содержат PiP_i как подстроку?

Но в бухгалтерии все перепутали, и ответить на запросы за Пупу придется Вам.

Суммарный размер строк Pi200000P_i\le200000

4 2 a b ab bab 1 3 a 1 4 ab
2 2
IDE

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

Некоторые запросы обновления можно легко обрабатывать группой, например сделав scanline, но тяжело обрабатывать по одному. В таких случаях можно откладывать их выполнение, и запоминать их в какой-нибудь список. При размере списка O(n)\mathcal{O}(\sqrt{n}) можно обработать все запросы этого списка группой. При выполнении get-запросов достаточно смотреть на все запросы внутри списка и смотреть, как они влияют на ответ

IDE

O: Винни Пух и бочки меда

Малыш и Карлсон решили пойти на прогулку. Они знают, что прогулка будет совсем скучной, если перед ней не опустошить несколько банок варенья.
Малыш достал из кладовки N банок варенья и выставил их в ряд. В банке номер ii содержится ровно a ii грамм варенья. Карлсон немного подумал и решил, что в некоторых банках недостаточно варенья, и что в банке номер ii должно быть хотя бы bib_i грамм варенья.
Выходить из этой ситуации Карлсон хочет в MM этапов. На каждом этапе он выбирает числа ll, rr, xx и yy, а затем выполняет следующие операции: в банку номер ll он добавляет x грамм варенья, в банку номер l+1l +  1x+yx + y грамм варенья, в банку номер l+2l + 2x+2yx + 2· y, и так далее. В банку номер rr наш герой добавит x+y(rl)x + y ·(r - l) грамм варенья.
Малышу хочется определить для каждой банки i наименьший номер операции, после которой в ней станет хотя бы b i грамм варенья. Помогите Малышу: найдите соответствующее число для каждой банки.

В первой строке входного файла задано одно число N(1n105)N (1 ≤ n ≤ 10^{5}) — количество банок. Во второй строке заданы NN чисел ai(0ai2109)a_i (0 ≤ a_i ≤ 2·10^{9}) — изначальное количество варенья в банке номер ii. В третьей строке заданы NN чисел bib_i (0bi2109)(0 ≤ b_i ≤ 2·10^{9}) — минимальное количество варенья, которое должно быть в банке номер ii.
В четвертой строке задано MM (0M105)(0 ≤ M ≤ 10^{5}) — число этапов добавления варенья в банки, которые выполнит Карлсон. В следующих MM строках описаны сами этапы в хронологическом порядке. Каждый этап задан четырьмя числами ll, rr, xx и yy (1lrN,0x,y105)(1 \le l \le r \le N, 0 \le x, y \le  10^{5}).
Выходные данные
Выведите NN чисел в одной строке, разделенные пробелом. Число номер ii должно быть равно нулю, если в банке номер ii изначально было достаточно варенья, номеру этапа, после которого в ней станет хотя бы bib_i варенья, или 1- 1, если даже после выполнения всех этапов, в этой банке будет недостаточно варенья. Этапы нумеруются с единицы.

5 5 4 4 2 1 7 7 4 7 7 3 1 2 2 0 2 5 1 1 3 4 2 2
1 2 0 3 -1
IDE

# Алгоритм Мо

Пусть есть задача на массиве, которую, которую мы умеем решать без запросов обновления, в offline. Запросы могут быть любой степени ужасности, если мы умеем на них отвечать структурой данных, которая хранит информацию об отрезке [l,r][l, r] и поддерживает следующие операции:

  1. add_left
  2. add_right
  3. del_left
  4. del_right
  5. query

, которые меняют границы отрезка и внтуреннею структуру данных, а так же позволяют сделать запрос. Все запросы мы пересортируем по паре (l,r)(\lfloor \sqrt{l} \rfloor, r). Отвечать на запрос мы будем таким образом: с помощью реализованных операций изменим необходимые нам границы отрезка, после чего вызовем запрос query.

Заметим, что левые границы разбиваются по блокам, внутри блока правые границы отсортированы. При переходе от запроса к запросу, левая граница делает O(n)\mathcal{O}(\sqrt{n}) сдвигов. Правая же граница для запросов одного блока сделает суммарно не более O(n)\mathcal{O}(n). Так как общее число блоков O(n)\mathcal{O}(\sqrt{n}), то и суммарное время работы составляет O(nn)\mathcal{O}(n\sqrt{n})

IDE

P: Мощные юнги

Имеется список из nn юнг, для каждого из которых известен его рост a1,a2,a3,...,ana_1,a_2,a_3,...,a_n. Рассмотрим некоторый его подсписок al,al+1,al+2,...,ara_l,a_{l+1},a_{l+2},...,a_r, где 1lrn1\le l \le r \le n, и для каждого натурального числа ss обозначим через KsK_s число юнг с ростом ss в этом подсписке. Назовем мощностью подсписка сумму произведений KsKssK_s \cdot K_s \cdot s по всем различным натуральным ss. Так как количество различных чисел в массиве конечно, сумма содержит лишь конечное число ненулевых слагаемых.
Необходимо вычислить мощности каждого из tt заданных подсписков.

Формат входных данных

Первая строка содержит два целых числа nn и tt (1n,t200000)(1 \le n, t \le 200000) — длина списка и количество запросов соответственно. Вторая строка содержит nn натуральных чисел aia_i (1ai106)(1 \le a_i \le 10^{6}) — рост юнг. Следующие tt строк содержат по два натуральных числа ll и rr (1lrn)(1 \le l \le r \le n) — индексы левого и правого концов соответствующего подсписка.

Формат выходных данных

Выведите tt строк, где ii-ая строка содержит единственное натуральное число — мощность подсписка ii-го запроса

3 2 1 2 1 1 2 1 3
3 6
8 3 1 1 2 2 1 3 1 1 2 7 1 6 2 7
20 20 20
IDE

Q: Инверсии на отрезке

Дана перестановка из nn элементов. Ответьте на m запросов про число инверсий для подотрезка перестановки от ll до rr. Инверсией называется пара индексов i,ji, j такая, что i<ji \lt j и ai>aja_i > a_j , где aia_i - это i-ый элемент перестановки.

Формат входных данных

В первой строке задано число nn (1n105)(1 \le n \le 10^{5}). Во второй строке задана перестановка из nn элементов (элементы перестановки — попарно различные целые числа от 1 до nn). В третьей строке задано число mm (1m105)(1 \le m \le 10^{5}). В последующих mm строках содержится по два числа, ll и rr, границы запроса (1l,rn)(1 \le l, r \le n).

Формат выходных данных

Выведите mm строк, ответы на данные запросы.

5 4 5 2 3 1 3 1 3 3 5 1 5
2 2 8
6 5 2 4 3 1 6 4 4 6 2 5 1 5 1 6
1 4 8 8
IDE

# Мо на дереве

TBA

IDE

R: MEX на пути в дереве

Дано дерево, на каждом ребре которого написано неотрицательное целое число. Вам необходимо ответить на несколько запросов вида «для данных вершин uu, vv назовите наименьшее неотрицательное целое число, которое не встречается среди чисел, написанных на ребрах на пути от uu до vv».

Входные данные

Первая строка входных данных содержит два числа nn и qq (1n,q31051 \le n, q \le 3 * 10^5), количество вершин и количество запросов. Следующие n1n − 1 строк содержат по три числа uiu_i ,viv_i, xix_i (1ui,vin;0xi1091 \le u_i, v_i \le n; 0 \le x_i \le 10^9) которые описывают ребро дерева (uiu_i, viv_i), на котором написано число xix_i. Следующие qq строк содержат по паре чисел aja_j, bjb_j, которая обозначает запрос на пути от aja_j до bjb_j

Выходные данные

Для каждого запроса выведите единственное число — минимальное неотрицательное число, которое не встречается на пути.

7 6 2 1 1 3 1 2 1 4 0 4 5 1 5 6 3 5 7 4 1 3 4 1 2 4 2 5 3 5 3 7
0 1 2 2 3 3
IDE

# 3Д Мо

TBA

IDE

S: Дима и массив

Диме не дарили массив aa, состоящий из nn целых чисел на день рождения, он не покупал его, не находил на улице, а он у него просто есть и всегда был, и Диме не очень-то и интересно откуда. Дима не играет с массивом, не дарит его Пете, не режет на кусочки и не стремится его уничтожить. Дима просто выполняет операции двух видов со своим массивом:

  1. ?? ll rr — узнать MEX мультимножества {al,al+1,...,ar}\{a_l, a_{l+1}, . . . , a_r\}
  2. !! ii xx — присвоить aia_i значение xx (0xn)(0 \le x \le n)

MEX мультимножества чисел {a1,a2,...,ak}\{a_1, a_2, . . . , a_k\} — это минимальное целое t0t \ge 0 такое, что tait \ne a_i для всех 1ik1 \le i \le k.

На самом деле, Диме не очень нравится выполнять операции двух видов со своим массивом. Диму волнуют лишь результаты операций первого типа. Помогите Диме и напишите программу, которая выполнит операции за него.

Формат входных данных

Первая строка содержит два целых числа nn и qq (1n500000,1q250000)(1 \le n \le 500\,000, 1 \le q \le 250\,000) — размер массива, который есть у Димы и количество операций, соответственно. Вторая строка содержит nn целых чисел aia_i (0ain)(0 \le a_i \le n) — массив Димы до начала операций. Каждая из следующих qq строк содержит описание одной операции в формате, описанном выше. Элементы массива пронумерованы, начиная с 1.

Формат выходных данных

Для каждой операцияя первого типа выведите одно целое число — MEX соответствующего мультимножества. Ответы на запросы выводите в порядке, в котором они заданы во входных данных.

6 8 4 1 0 2 2 3 ? 1 6 ? 4 6 ? 2 5 ? 2 6 ! 3 3 ? 1 6 ! 4 0 ? 1 6
5 0 3 4 0 5
IDE

T: Машинное обучение

На курсе машинного обучения вам выдали первое домашнее задание — вам предстоит проанализировать некоторый массив из n чисел. В частности, вы интересуетесь так называемой равномерностью массива. Предположим, что в массиве число b1b1 встречается k1k1 раз, b2b_2 - k2k_2 раз, и т.д. Тогда равномерностью массива называется такое минимальное целое число c1c \ge 1, что ckic \ne k_i для любого ii. В рамках вашего исследования вы хотите последовательно проделать qq операций.

Операция ti=1t_i = 1, lil_i, rir_i задаёт запрос исследования. Необходимо вывести равномерность массива, состоящего из элементов на позициях от lil_i до rir_i включительно.

Операция ti=2t_i = 2, pip_i, xix_i задаёт запрос уточнения данных. Начиная с этого момента времени pip_i-му элементу массива присваивается значения xix_i.

Входные данные

Первая строка содержит nn и qq — размер массива и число запросов соответственно. Во второй строке записаны ровно nn чисел — a1,a2,...,ana_1, a_2, ..., a_n (1ai1091 \le a_i \le 10^9). Каждая из оставшихся qq строк задаёт очередной запрос. Запрос первого типа задаётся тремя числами ti=1t_i = 1, lil_i, rir_i, где 1lirin1 \le  l_i \le r_i \le n — границы соответствующего отрезка. Запрос второго типа задаётся тремя числами ti=2t_i = 2, pip_i, xix_i, где 1pin1 \le  p_i  \le  n — позиция в которой нужно заменить число, а 1xi1091 \le  x_i  \le 10^9 — его новое значение

Выходные данные

Для каждого запроса первого типа выведите одно число — равномерность соответствующего отрезка массива.

10 4 1 2 3 1 1 2 2 2 9 9 1 1 1 1 2 8 2 7 1 1 2 8
2 3 2
IDE