<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.66.31.165&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.66.31.165&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.66.31.165"/>
		<updated>2026-04-18T01:03:03Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=20375</id>
		<title>Сведение задачи RMQ к задаче LCA</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=20375"/>
				<updated>2012-04-08T14:06:09Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.31.165: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи RMQ ==&lt;br /&gt;
Дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt;. Поступают запросы вида &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;, на каждый запрос требуется найти минимум в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, начиная с позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и заканчивая позицией &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Wiki.PNG|thumb|right|300x160px|Пример построенного дерева для массива А]]&lt;br /&gt;
Декартово дерево (англ. ''сartesian tree'') на массиве &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt; {{---}} это бинарное дерево, рекурсивно определенное следующим образом:&lt;br /&gt;
* Корнем дерева является минимальное значение в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, скажем &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;. Если минимальных значений несколько, можно взять любое.&lt;br /&gt;
* Левым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[1..i-1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Правым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[i+1..N]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Построим декартово дерево на массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;RMQ(i, j)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Мы знаем что:&lt;br /&gt;
* Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt; меньше их самих.&lt;br /&gt;
* &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; ближайший к корню и по п.1 имеет наименьшее значение в своем поддереве. По построению, это поддерево содержит в частности подмассив &amp;lt;tex&amp;gt;A[i..j], &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; находится между &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;RMQ(i, j).&amp;lt;/tex&amp;gt;&lt;br /&gt;
== Построение дерева за линейное время ==&lt;br /&gt;
Пусть дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt;. Будем по очереди слева на право добавлять элементы в дерево. Чтобы добавить новое значение &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;, начнем обход из вершины &amp;lt;tex&amp;gt;A[i-1]&amp;lt;/tex&amp;gt; к корню, пока не найдем вершину &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;x &amp;lt; A[i]&amp;lt;/tex&amp;gt;. Тогда правого сына &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; назначим левым сыном &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; {{---}} правым сыном &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Рассмотрим правую ветку дерева, т.е. по которой проходит обход алгоритма. Заметим, что при добавлении нового узла в дерево элементы, по которым только что прошелся алгоритм отправляются налево, т.е. перестают принадлежать правой ветке. Таким образом процедура поиска родителя не сможет выполнится более &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз и итоговая асимптотика алгоритма &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Сложность ==&lt;br /&gt;
Выше описан алгоритм построения дерева за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Препроцессинг для &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и ответ на запрос &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
В итоге получили &amp;lt;tex&amp;gt;RMQ&amp;lt;/tex&amp;gt; {построение &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, запрос &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
==Ссылки==&lt;br /&gt;
*[http://e-maxx.ru/algo/rmq_linear Задача RMQ. Решение за O (1) с препроцессингом O (N)]&lt;/div&gt;</summary>
		<author><name>178.66.31.165</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=20374</id>
		<title>Сведение задачи RMQ к задаче LCA</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=20374"/>
				<updated>2012-04-08T14:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.31.165: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи RMQ ==&lt;br /&gt;
Дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt;. Поступают запросы вида &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;, на каждый запрос требуется найти минимум в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, начиная с позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и заканчивая позицией &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Wiki.PNG|thumb|right|300x160px|Пример построенного дерева для массива А]]&lt;br /&gt;
Декартово дерево (англ. ''сartesian tree'') на массиве &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt; {{---}} это бинарное дерево, рекурсивно определенное следующим образом:&lt;br /&gt;
* Корнем дерева является минимальное значение в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, скажем &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;. Если минимальных значений несколько, можно взять любое.&lt;br /&gt;
* Левым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[1..i-1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Правым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[i+1..N]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Построим декартово дерево на массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;RMQ(i, j)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Мы знаем что:&lt;br /&gt;
* Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt; меньше их самих.&lt;br /&gt;
* &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; ближайший к корню и по п.1 имеет наименьшее значение в своем поддереве. По построению, это поддерево содержит в частности подмассив &amp;lt;tex&amp;gt;A[i..j], &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; находится между &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;RMQ(i, j).&amp;lt;/tex&amp;gt;&lt;br /&gt;
== Построение дерева за линейное время ==&lt;br /&gt;
Пусть дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt;. Будем по очереди слева на право добавлять элементы в дерево. Чтобы добавить новое значение &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;, начнем обход из вершины &amp;lt;tex&amp;gt;A[i-1]&amp;lt;/tex&amp;gt; к корню, пока не найдем вершину &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, для которой &amp;lt;tex&amp;gt;x &amp;lt; A[i]&amp;lt;/tex&amp;gt;. Тогда правого сына &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; назначим левым сыном &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; {{---}} правым сыном &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Рассмотрим правую ветку дерева, т.е. по которой проходит обход алгоритма. Заметим, что при добавлении нового узла в дерево элементы, по которым только что прошелся алгоритм отправляются налево, т.е. перестают принадлежать правой ветке. Таким образом процедура поиска родителя не сможет выполнится более &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз и итоговая асимптотика алгоритма &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Сложность ==&lt;br /&gt;
Выше описан алгоритм построения дерева за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Препроцессинг для &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и ответ на запрос &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
В итоге получили &amp;lt;tex&amp;gt;RMQ&amp;lt;/tex&amp;gt; {построение &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, запрос &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
==Ссылки==&lt;br /&gt;
*[[http://e-maxx.ru/algo/rmq_linear|Задача RMQ. Решение за O (1) с препроцессингом O (N)]]&lt;/div&gt;</summary>
		<author><name>178.66.31.165</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=20365</id>
		<title>Сведение задачи RMQ к задаче LCA</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_RMQ_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_LCA&amp;diff=20365"/>
				<updated>2012-04-08T12:53:12Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.31.165: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи RMQ ==&lt;br /&gt;
Дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt;. Поступают запросы вида &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;, на каждый запрос требуется найти минимум в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, начиная с позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и заканчивая позицией &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Wiki.PNG|thumb|right|300x160px|Пример построенного дерева для массива А]]&lt;br /&gt;
Декартово дерево (англ. ''сartesian tree'') на массиве &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt; {{---}} это бинарное дерево, рекурсивно определенное следующим образом:&lt;br /&gt;
* Корнем дерева является минимальное значение в массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, скажем &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt;. Если минимальных значений несколько, можно взять любое.&lt;br /&gt;
* Левым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[1..i-1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Правым поддеревом является декартово дерево на массиве &amp;lt;tex&amp;gt;A[i+1..N]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Построим декартово дерево на массиве &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;RMQ(i, j)&amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Мы знаем что:&lt;br /&gt;
* Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt; меньше их самих.&lt;br /&gt;
* &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; ближайший к корню и по п.1 имеет наименьшее значение в своем поддереве. По построению, это поддерево содержит в частности подмассив &amp;lt;tex&amp;gt;A[i..j], &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; находится между &amp;lt;tex&amp;gt;A[i]&amp;lt;/tex&amp;gt; и  &amp;lt;tex&amp;gt;A[j]&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;LCA(A[i], A[j])&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;RMQ(i, j).&amp;lt;/tex&amp;gt;&lt;br /&gt;
== Сложность ==&lt;br /&gt;
Построение дерева наивным алгоритмом &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;. Существует алгоритм построения за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Препроцессинг для &amp;lt;tex&amp;gt;LCA&amp;lt;/tex&amp;gt; {{---}} &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; и ответ на запрос &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
В итоге получили &amp;lt;tex&amp;gt;RMQ&amp;lt;/tex&amp;gt; {построение &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, запрос &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Сведение задачи LCA к задаче RMQ]]&lt;/div&gt;</summary>
		<author><name>178.66.31.165</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_LCA_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_RMQ&amp;diff=20362</id>
		<title>Сведение задачи LCA к задаче RMQ</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_LCA_%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B5_RMQ&amp;diff=20362"/>
				<updated>2012-04-08T11:23:59Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.31.165: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Постановка задачи LCA ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition = '''Наименьшим общим предком (least common ancestor)''' двух узлов &amp;lt;tex&amp;gt;u, v&amp;lt;/tex&amp;gt; в корневом дереве &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; называется узел &amp;lt;tex&amp;gt;w,&amp;lt;/tex&amp;gt; который среди всех узлов, являющихся предками как узла &amp;lt;tex&amp;gt;u,&amp;lt;/tex&amp;gt; так и &amp;lt;tex&amp;gt;v,&amp;lt;/tex&amp;gt; имеет наибольшую глубину.&lt;br /&gt;
}}&lt;br /&gt;
Пусть дано корневое дерево &amp;lt;tex&amp;gt;T.&amp;lt;/tex&amp;gt; На вход подаются запросы вида &amp;lt;tex&amp;gt;(u,\;v),&amp;lt;/tex&amp;gt; для каждого запроса требуется найти их наименьшего общего предка.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
=== Препроцессинг ===&lt;br /&gt;
1) В каждом узле будет храниться глубина узла в корневом дереве &amp;lt;tex&amp;gt;T.&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;depth(u)= \begin{cases}&lt;br /&gt;
0 &amp;amp; u = root(T),\\&lt;br /&gt;
depth(v) + 1 &amp;amp; u = son(v).&lt;br /&gt;
\end{cases}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Запустим [[Обход в глубину, цвета вершин|обход в глубину]] из корня, который будет строить список посещений узлов. Глубина текущей вершины добавляется в список при входе в эту вершину, а также после каждого возвращения из её сына.&lt;br /&gt;
&lt;br /&gt;
=== Запрос ===&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;I[u]&amp;lt;/tex&amp;gt; {{---}} функция, возвращающая все индексы ячеек в списке глубин &amp;lt;tex&amp;gt;depth[start..end]&amp;lt;/tex&amp;gt;, в которых хранится глубина узла &amp;lt;tex&amp;gt;u.&amp;lt;/tex&amp;gt;&lt;br /&gt;
Пусть имеется запрос пара узлов &amp;lt;tex&amp;gt;u, v.&amp;lt;/tex&amp;gt; В результате обхода в глубину получился список глубин вершин, в котором наименьшему общему предку вершин &amp;lt;tex&amp;gt;u, v&amp;lt;/tex&amp;gt; соответствует минимальная глубина на отрезке &amp;lt;tex&amp;gt;depth[I[u], I[v]].&amp;lt;/tex&amp;gt; Можно брать любое значение &amp;lt;tex&amp;gt;I[u].&amp;lt;/tex&amp;gt; Для определённости &amp;lt;tex&amp;gt;I[u] \le I[v].&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Доказательство корректности алгоритма ==&lt;br /&gt;
Рассмотрим два узла &amp;lt;tex&amp;gt;u, v&amp;lt;/tex&amp;gt; корневого дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;. Для определенности считаем, что &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; является первой при поиске в глубину. Обозначим &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; {{---}} любой индекс из &amp;lt;tex&amp;gt;I[u]&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} из &amp;lt;tex&amp;gt;I[v]&amp;lt;/tex&amp;gt;. На отрезке &amp;lt;tex&amp;gt;depth[a..end]&amp;lt;/tex&amp;gt; хранятся узлы посещенные после &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и, быть может, некоторые вершины из поддерева с корнем &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;(которые имеют глубину больше глубины &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;). Аналогично на &amp;lt;tex&amp;gt;depth[start..b]&amp;lt;/tex&amp;gt; {{---}} вершины, посещенные до &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и некоторые вершины из поддерева &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Рассмотрим теперь отрезок &amp;lt;tex&amp;gt;depth[a..b]&amp;lt;/tex&amp;gt;. Поскольку этот отрезок {{---}} путь из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, он проходит через их наименьшего общего предка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;(в дереве есть только один простой путь между вершинами). Покажем, что его глубина минимальна на отрезке &amp;lt;tex&amp;gt;depth[a..b]&amp;lt;/tex&amp;gt;. Допустим обратное. Все потомки &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; имеют глубину больше. Но тогда получим, что поиск в глубину вышел из поддерева вершины &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; раньше, чем посетил вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим дерево на рисунке 1. Найдем наименьшего общего предка вершин, помеченных красным цветом.&lt;br /&gt;
Список глубин, получающийся в результате обхода в глубину - &amp;lt;tex&amp;gt;[0, 1, 2, 1, 2, 1, 0, 1, 0].&amp;lt;/tex&amp;gt;&lt;br /&gt;
Глубина наименьшего общего предка красных вершин равна минимуму на отрезке &amp;lt;tex&amp;gt;[2, 1, 0, 1].&amp;lt;/tex&amp;gt;&lt;br /&gt;
[[Файл:Lca to rmq.png|thumb|left|рис. 1]]&lt;br /&gt;
&amp;lt;div style='clear:left;'&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сложность ==&lt;br /&gt;
&lt;br /&gt;
Для нахождения минимального элемента на отрезке можно использовать [[Дерево отрезков. Построение|дерево отрезков]]. Длина массива глубин будет равна &amp;lt;tex&amp;gt;(2n - 1),&amp;lt;/tex&amp;gt; т.е. дерево отрезков будет построено за &amp;lt;tex&amp;gt;O(n).&amp;lt;/tex&amp;gt; Таким образом, препроцессинг работает за &amp;lt;tex&amp;gt;O(n).&amp;lt;/tex&amp;gt; Время выполнения запроса равно времени запроса минимального элемента на отрезке в дереве отрезков, т.е. &amp;lt;tex&amp;gt;O(\log n).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Метод двоичного подъема]]&lt;br /&gt;
*[[Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
*[[Алгоритм Фарака-Колтона и Бендера]]&lt;br /&gt;
*[[Сведение задачи RMQ к задаче LCA]]&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[http://e-maxx.ru/algo/lca Наименьший общий предок. Нахождение за O (sqrt (N)) и O (log N) с препроцессингом O (N)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>178.66.31.165</name></author>	</entry>

	</feed>