Решение #1
Идея в том, чтобы хранить последовательность возрастающих минимумов. Первый элемент последовательности равен минимуму всего текущего окна, следом идёт минимум на суффиксе после этого элемента, и так далее. Например, для последовательности [2,3,1,5,4,8,7,6,9] это будут минимумы [1,4,6,9]
Когда происходит добавление элемента справа (incR, push_back), последовательность меняется следующим образом: все большие элементы убираются, сам элемент добавляется в конец.
Несколько примеров, для [1,4,6,9]
:
Добавление 5: [1,4,6,9] -> [1,4] -> [1,4,5]
Добавление 100: [1,4,6,9] -> [1,4,6,9,100]
Добавление 0: [1,4,6,9] -> [] -> [0]
При удалении элемента слева (incL, pop_front) нужно знать, был ли главный минимум первым элементом окна. Просто по значению этого не понять, поэтому в последовательности помимо значений нужно хранить в паре с ними позиции этих значении. Пример выше превратится в последовательность [(1,2), (4,4), (6,7), (9,8)], если элементы нумеруются с нуля. Границы текущего окна нужно хранить явно в виде пары чисел l и r. Итак, если первый элемент последовательности является первым элементом окна, то есть его позиция равна l, то его необходимо просто удалить, более ничего в последовательности не изменится.
Для реализации потребуется структура данных, позволяющая эффективно делать операции удаления слева и справа, а также добавления справа. Для этого можно использовать дек (std::deque в c++)