Вопрос 1
Переменная p
не означает родителя, она означает ребенка. В for
l oop, i
является дочерним узлом, и мы обновляем значение родительского элемента i
.
tree[p+n] = value;
: обновляем значение покидающего узла (узла без дочерних элементов). Затем мы обновляем значение родителя узла с узла отпуска. tree[i>>1] = tree[i] + tree[i^1];
, tree[i>>1]
является tree[i]
'родительским.
Например: размер массива равен 16 (размер дерева равен 32), и я хочу обновить arr [8]. Поэтому я звоню updateTreeNode(8, value)
. Сначала обновляется three[8+16]
, что соответствует arr[8]
. Тогда p
устанавливается на 24. В течение l oop мы обновляем родительский элемент p (дерево [12]), затем устанавливаем p на p / 2 (p = 12), пока p не будет иметь родителя.
Quration 2
Если l
и r
четные, мы добавляем значение родителя в следующем повторении. Это функция дерева сегментов, чтобы не запрашивать каждый элемент в интервале.
Например: размер массива равен 16, и я хочу сделать запрос [8,10). В сегментном дереве интервал составляет [24,26). Нам не нужно добавлять значения tree[24]
и tree[25]
, мы добавляем значение tree[12]
!