<?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=95.26.124.164&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=95.26.124.164&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/95.26.124.164"/>
		<updated>2026-04-30T13:23:00Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%BD%D0%B8%D0%B7%D1%83&amp;diff=24129</id>
		<title>Реализация запроса в дереве отрезков снизу</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%BD%D0%B8%D0%B7%D1%83&amp;diff=24129"/>
				<updated>2012-06-06T15:43:22Z</updated>
		
		<summary type="html">&lt;p&gt;95.26.124.164: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Down-up2.png‎|right|255px|thumb|Реализация запроса снизу вверх]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
Реализация запроса снизу вверх в дереве отрезков является, в отличие от [[Реализация запроса в дереве отрезков сверху| реализации запроса сверху вниз]], итеративным методом. Будем рассматривать абстрактную операцию, обладающую свойством ассоциативности.&lt;br /&gt;
&lt;br /&gt;
[[Дерево отрезков. Построение|Построим дерево отрезков]] и установим границы отрезка на соответствующие листья. Если элемент, попавший на левую границу, является правым сыном, то запишем в результат значение, полученное после выполнения нашей операции над предыдущим результатом и значением этого элемента, а левую границу перемещаем на один элемент вправо. Таким образом мы учтем вклад нужной нам вершины и избавимся от  вклада ненужного нам поддерева. Аналогично действуем с элементом попавшим на правую границу (является ли этот элемент левым сыном). Затем устанавливаем границы отрезка на родительские элементы текущих границ. Это позволит узнать, входит ли полученный отрезок в искомый или нет. Продолжаем до тех пор, пока границы не пересекутся. Если после завершения цикла границы совпадут, значит полученный отрезок входит в искомый, и надо пересчитать результат, иначе {{---}} ничего делать не надо.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
&lt;br /&gt;
Пусть ассоциативная операция, над которой построено дерево отрезков, обозначается a &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; b, а результат считаем на отрезке [left, right]. При этом значения передающиеся в функцию left и right должны указывать на листья дерева (необходимо увеличить значение на индекс массива, с которого начинаются листья).&lt;br /&gt;
&lt;br /&gt;
   query(left, right)&lt;br /&gt;
      result = neutral; // Присваиваем результату значение нейтрального элемента (например для поиска суммы надо присвоить значение 0)&lt;br /&gt;
      '''while''' left &amp;lt; right // Выполняем цикл до тех пор, пока левая и правая граница не пересекутся&lt;br /&gt;
         '''if''' left mod 2 == 0 // Проверяем, является ли левая граница правым сыном (индексация с 0)&lt;br /&gt;
            result = result &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; data[left]; // Если является, то пересчитаем результат и перенесем левую границу&lt;br /&gt;
            left = left div 2; &lt;br /&gt;
         '''else'''&lt;br /&gt;
            left = left div 2; // Если не является, то установим границу на родительский элемент текущей границы&lt;br /&gt;
         '''if''' right mod 2 == 1 // Аналогично проделываем операции с правой границей&lt;br /&gt;
            result = result &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; data[right];&lt;br /&gt;
            right = (right - 2) div 2;&lt;br /&gt;
         '''else'''&lt;br /&gt;
            right = (right - 2) div 2;&lt;br /&gt;
      '''if''' left == right // После окончания цикла проверяем совпали ли границы  &lt;br /&gt;
         result = result &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; data[left]; // Если надо пересчитываем результат&lt;br /&gt;
      '''return''' result;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&lt;br /&gt;
[http://e-maxx.ru/algo/segment_tree MAXimal :: algo :: Дерево отрезков]&lt;br /&gt;
&lt;br /&gt;
[http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2  Википедия {{---}} Дерево отрезков]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006 Визуализатор]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006/algorithm Алгоритм]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дерево отрезков]]&lt;/div&gt;</summary>
		<author><name>95.26.124.164</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%BD%D0%B8%D0%B7%D1%83&amp;diff=24126</id>
		<title>Реализация запроса в дереве отрезков снизу</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0_%D0%B2_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B5_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2_%D1%81%D0%BD%D0%B8%D0%B7%D1%83&amp;diff=24126"/>
				<updated>2012-06-06T15:29:26Z</updated>
		
		<summary type="html">&lt;p&gt;95.26.124.164: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Down-up2.png‎|right|255px|thumb|Реализация запроса снизу вверх]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
&lt;br /&gt;
Реализация запроса снизу вверх в дереве отрезков является, в отличие от [[Реализация запроса в дереве отрезков сверху| реализации запроса сверху вниз]], итеративным методом. Будем рассматривать абстрактную операцию, обладающую свойством ассоциативности.&lt;br /&gt;
&lt;br /&gt;
[[Дерево отрезков. Построение|Построим дерево отрезков]] и установим границы отрезка на соответствующие листья. Если элемент, попавший на левую границу, является правым сыном, то запишем в результат значение, полученное после выполнения нашей операции над предыдущим результатом и значением этого элемента, а левую границу перемещаем на один элемент вправо. Таким образом мы учтем вклад нужной нам вершины и избавимся от  вклада ненужного нам поддерева. Аналогично действуем с элементом попавшим на правую границу (является ли этот элемент левым сыном). Затем устанавливаем границы отрезка на родительские элементы текущих границ. Это позволит узнать, входит ли полученный отрезок в искомый или нет. Продолжаем до тех пор, пока границы не пересекутся. Если после завершения цикла границы совпадут, значит полученный отрезок входит в искомый, и надо пересчитать результат, иначе {{---}} ничего делать не надо.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
&lt;br /&gt;
Пусть ассоциативная операция, над которой построено дерево отрезков, обозначается a &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; b, а результат считаем на отрезке [left, right]. При этом значения передающиеся в функцию left и right должны указывать на листья дерева (необходимо увеличить значение на индекс массива, с которого начинаются листья).&lt;br /&gt;
&lt;br /&gt;
   query (left, right)&lt;br /&gt;
      result = neutral; // Присваиваем результату значение нейтрального элемента (например для поиска суммы надо присвоить значение 0)&lt;br /&gt;
      '''while''' left &amp;lt; right // Выполняем цикл до тех пор, пока левая и правая граница не пересекутся&lt;br /&gt;
         '''if''' left mod 2 == 0 // Проверяем, является ли левая граница правым сыном (индексация с 0)&lt;br /&gt;
            result = result &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; data[left]; // Если является, то пересчитаем результат и перенесем левую границу&lt;br /&gt;
            left = left div 2; &lt;br /&gt;
         '''else'''&lt;br /&gt;
            left = left div 2; // Если не является, то установим границу на родительский элемент текущей границы&lt;br /&gt;
         '''if''' right mod 2 == 1 // Аналогично проделываем операции с правой границей&lt;br /&gt;
            result = result &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; data[right];&lt;br /&gt;
            right = (right - 2) div 2;&lt;br /&gt;
         '''else'''&lt;br /&gt;
            right = (right - 2) div 2;&lt;br /&gt;
      '''if''' left == right // После окончания цикла проверяем совпали ли границы  &lt;br /&gt;
         result = result &amp;lt;tex&amp;gt; \circ &amp;lt;/tex&amp;gt; data[left]; // Если надо пересчитываем результат&lt;br /&gt;
      '''return''' result;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&lt;br /&gt;
[http://e-maxx.ru/algo/segment_tree MAXimal :: algo :: Дерево отрезков]&lt;br /&gt;
&lt;br /&gt;
[http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D0%BE%D0%B2  Википедия {{---}} Дерево отрезков]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006 Визуализатор]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/trees/segment-2006/algorithm Алгоритм]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дерево отрезков]]&lt;/div&gt;</summary>
		<author><name>95.26.124.164</name></author>	</entry>

	</feed>