Похоже, во всем Интернете есть только одна хорошая статья о ленивом распространении в дереве сегментов: http://www.spoj.pl/forum/viewtopic.php?f=27&t=8296
Я понял концепцию обновления только узла запроса и маркировки его дочернего элемента. Но мой вопрос в том, что, если я сначала запрошу дочерний узел, а потом родительский узел.
В этом дереве (вместе с расположением в массиве кучи)
0->[0 9]
1->[0 4] 2->[5 9]
3->[0 2] 4->[3 4] 5->[5 7] 6->[8 9]
.....................................
Первый запрос, если я обновлю [0 4], его данные будут изменены, а его дочерний элемент будет помечен. Второй запрос — это состояние чтения сегмента [0 9].
Вот столкнулся с проблемой. Моя реализация дерева сегментов такова, что значение каждого узла является суммой его левого и правого дочерних элементов. Поэтому, когда я обновляю значение узла, я должен обновить всех родителей. Чтобы исправить логическую проблему, теперь я обновляю всех родителей узла (пока он не достигнет корня дерева). Но это снижает производительность, и вся моя цель использования дерева сегментов для быстрого пакетного обновления теряется.
Может ли кто-нибудь объяснить, где я ошибаюсь в использовании дерева сегментов?