отображение данных и ленивое распространение в дереве сегментов

Похоже, во всем Интернете есть только одна хорошая статья о ленивом распространении в дереве сегментов и это: 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].

Здесь я столкнулся с проблемой. Моя реализация дерева сегментов такова, что значение каждого узла является суммой его левого и правого дочерних элементов. Поэтому, когда я обновляю значение узла, я должен обновить всех родителей. Чтобы исправить логическую проблему, теперь я обновляю всех родителей узла (пока он не достигнет корня дерева). Но это снижает производительность, и вся моя цель использования дерева сегментов для быстрого пакетного обновления теряется.

Кто-нибудь может объяснить, где я ошибаюсь при использовании дерева сегментов?

14
задан OmG 19 January 2017 в 10:39
поделиться