1
правка
Изменения
Не соблюдены нормы русского языка. Изменил 3 ошибки (одна орфографическая и две пунктуационных).
== Алгоритм ==
===Описание===[[Файл:Wiki.PNG|thumb|right|400x200px|Пример декартового дерева]]Будем решать задачу RMQ, уже умея решать задачу LCA. Для хранения решения задачи о LCA будем использовать [[декартово дерево по неявному ключу]]. Тогда минимум на отрезке от <tex> i </tex> до <tex> j </tex> массива <tex> A </tex> будет равен наименьшему общему предку <tex>i</tex>-того и <tex>j</tex>-того элементов из декартова дерева, построенного на массиве <tex> A </tex>. Декартово дерево (англ. ''сartesian tree'') по неявному ключу на массиве <tex>A[1..N]</tex> {{---}} это бинарное дерево, рекурсивно определенное следующим образомдопускающее следующее рекурсивное построение:* Корнем дерева является элемент массива, имеющий минимальное значение в массиве <tex>A</tex>, скажем <tex>A[i]</tex>. Если минимальных значений элементов несколько, можно взять любоелюбой.
* Левым поддеревом является декартово дерево на массиве <tex>A[1..i-1]</tex>.
* Правым поддеревом является декартово дерево на массиве <tex>A[i+1..N]</tex>.
Здесь и далее <tex>A[i]</tex> будет также использоваться для обозначения соответствующей вершины дерева.
Построим декартово дерево на массиве <tex>A</tex>. Тогда <tex>RMQ(i, j)</tex> = <tex>LCA(A[i], A[j])</tex>.
<br clear="all"> === Корректность = Доказательство ==
{{Теорема
|statement=
<tex>RMQ(i, j)</tex> = <tex>LCA(A[i], A[j])</tex>.
|proof=
}}
===Сложность = Построение дерева за линейное время ==Пусть дан массив <tex>AСуществует [[1..N]</tex>. Будем по очереди слева на право добавлять элементы в Декартово дерево. Чтобы добавить новое значение <tex>A[i#Построение декартова дерева|алгоритм]</tex>, начнем обход из вершины <tex>A[i-1]</tex> к корню, пока не найдем вершину который строит декартово дерево за <tex>xO(n)</tex>, для которой <tex>x < A. Используя [[iСведение задачи LCA к задаче RMQ | алгоритм построения LCA]</tex>. Тогда правого сына <tex>x</tex> назначим левым сыном <tex>A[i]</tex>, а получаем:препроцессинг для <tex>A[i]LCA</tex> {{---}} правым сыном <tex>x</tex>. Рассмотрим правую ветку дерева, т.е. по которой проходит обход алгоритма. Заметим, что при добавлении нового узла в дерево элементы, по которым только что прошелся алгоритм отправляются налево, т.е. перестают принадлежать правой ветке. Таким образом процедура поиска родителя не сможет выполнится более <tex>O(n)</tex> раз и итоговая асимптотика алгоритма ответ на запрос {{---}} <tex>O(n1)</tex>.== Сложность ==Выше описан алгоритм построения дерева Нам нужно единожды построить декартово дерево за <tex>O(n)</tex>.Препроцессинг для <tex>LCA</tex> {{---}} , единожды провести препроцессинг за <tex>O(n)</tex> и ответ отвечать на запрос запросы за <tex>O(1)</tex>. В итоге получили <tex>RMQ</tex> {построение с построением за <tex>O(n)</tex>, и ответом на запрос за <tex>O(1)</tex>}.
== См.также ==
*[[Сведение задачи LCA к задаче RMQ]]