Теоретический материал
Описание структуры
На практике дерево Фенвика представляет собой массив B из N чисел: B0, B1, ..., BN - 1, в k-м элементе которого хранится сумма элементов массива A с f (k)-го по k-й: Bk = Ai, где f (k) = k& (k + 1). Под & имеется ввиду операция побитового И.
Рис. 1.
Рассмотрим двоичное представление числа k (рис. 1): пусть в нем сначала идет произвольная последовательность 0 и 1, потом 0 и дальше некоторое количество единиц, в том числе нулевое. f (k) получается из k заменой всех этих подряд идущих единиц в младших разрядах нулями. Если же в младшем разряде числа k стоит 0, то f (k) = k. Так, например, для k = 1110 = 10112 получаем f (k) = 10002 = 810, а для k = 1010 = 10102 получаем f (k) = 10102 = 1010. Отметим важное свойство функции f: 0f (k)
k для любого k
0.
Рис. 2.
Диаграмма на рис. 2 показывает, что будет храниться в массиве B (дереве Фенвика) при N = 8: клетка i-й строки k-го столбца заштрихована, если Ai входит в частичную сумму Bk, то есть f (k)i
k.
Рассмотрим, как с помощью дерева Фенвика реализуются операции ответа на запрос rsq(i, j) о частичной сумме элементов массива A с i-го по j-й и запрос update(k, d ) прибавления к k-му элементу массива A числа d.