Мысль №1
Нарисуем на координатной плоскости направленный ациклический граф, в котором вершины - это элементы входного массива (с координатами <x=i, y=ai>), а направленные рёбра изображают отношение “больше по значению и правее по индексу”.
Мы можем хранить не все рёбра, если ребро может быть заменено цепочкой других рёбер, то его хранить не надо.
Можно ещё хранить второй комплект рёбер в другую сторону (“меньше по значению и левее по индексу”).
Ребер из вершины будет несколько, но самые интересные - четыре.
Если смотреть по оси индексов, то ближайший самый высокий из узлов слева и самый низкий из узлов справа. А если смотреть вдоль оси значений, то самый левый из высоких и самый правый из низких.
Когда меняем знак, из графа вершину удаляем, добавляем в новое место.
Когда изымать будем, то можно будет по горизонтали соединить предыдущий узел со следующим. А когда будем вставлять - надо подумать. вероятно в месте вставки узлы будут соединены, потому что они соседние по значениям, эту связь надо будет разорвать и провести через вставляемый узел.
Сложность операции типа 2 = O(log2(n)), потому что это операция вставки в сортированный список + несколько O(1) для изменения связей.
Сложность операции типа 1 = O(1).
Сложность предварительного построения - надо посчитать, но кажется примерно как у сортировки O(4·n·log2(n)) или n2.
Мысль №2
Если уже рассматриваем прямоугольник < <1;-105>,<n-1,105>>, то
можно делить на подпрямоугольники его, там вычислять для подпрямоугольников
минимальные, максимальные, левейшие и правейшие значения.
Вот это будет в духе корневой декомпозиции.
Мысль №3
Надо сделать программы:
- для генерации случайных наборов данных в требуемом формате;
- для проверки входного файла на корректность;
- для решения тупым методом “в лоб” без ограничения времени;
- для сверки результатов работы двух программ.
(Возможно, после просмотра нескольких случайных примеров и их результатов обработки прийдут какие-то новые мысли.)
Дальше пока мысль не идёт.
Держи в курсе. Мы волнуемся.