94
правки
Изменения
Нет описания правки
==Алгоритм==
Реализация запроса снизу вверх в дереве отрезков является, в отличие от [[Реализация запроса в дереве отрезков сверху| реализации запроса сверху вниз]], итеративным методом. Будем рассматривать дерево отрезков с операцией нахождения минимального значения(RMQ)абстрактную операцию, обладающую свойством ассоциативности.
==Псевдокод==
Пусть дерево отрезков реализовано ассоциативная операция выполняется функцией operation(arg1, arg2), а результат считаем на массиве с индексацией элементов с 1отрезке [left, right].
while left < right //Выполняем цикл до тех пор, пока левая и правая граница не пересекутся
if ((left) div 2) * 2 + 1 == left // Проверяем, является ли левая граница правым сыном(индексация с 0) result = minoperation(result, data[left]); // Если является, то пересчитаем результат и перенесем левую границу
left = (left + 1) div 2;
else
left = (left) div 2; // Если не является, то установим границу на родительский элемент текущей границы if ((right) div 2) * 2 + 1 == right // Аналогично проделываем операции с правой границей result = minoperation(result, data[right]);
right = (right - 1) div 2;
else
right = (right) div 2;
if left == right // После окончания цикла проверяем совпали ли границы
result = minoperation(result, data[left]); // Если надо пересчитываем результат
return result;