Я думал об использовании двоичного дерева с узлом, дополненным индикатором Left | Right и количеством элементов в этом поддереве.
- Еслииндикатор установлен на
Left
, затем начните с чтения левого потомка, затем прочитайте правый - Else (установите на
Right
), затем начните с чтения правого потомка, затем прочитайте левый
Report
довольно очевиден: O(log n)
Revert
немного сложнее, и я не уверен, действительно ли это сработает.
Идея заключалась бы в том, чтобы «изолировать» последовательность элементов для обращения в определенном поддереве (минимально возможное).Это поддерево содержит диапазон [a..b]
, включая [i..j]
- Обратное минимальное поддерево, которое содержит эту последовательность (изменение индикатора)
- Применить операцию
Revert
к [a..i-1]
и [j+1..b]
Не уверен, что это действительно работает, хотя: /
РЕДАКТИРОВАТЬ :
Предыдущее решение не работает:) Я не могу представить решение, которое не переставляет дерево, и они не соблюдают требования сложности.
Я оставлю это там на случай, если оно даст кому-то идею, и яудалите его потом, если я сам не найду решение.