private void Build(int treeArrayIndex, int segmentStartIndex, int segmentEndIndex) { if (segmentStartIndex == segmentEndIndex) { _treeArray[treeArrayIndex] = new SumQueryObject(segmentStartIndex, 0); return; } int leftChildTreeArrayIndex = 2 * treeArrayIndex + 1; int rightChildTreeArrayIndex = leftChildTreeArrayIndex + 1; int leftChildSegmentEndIndex = (segmentStartIndex + segmentEndIndex) / 2; Build(leftChildTreeArrayIndex, segmentStartIndex, leftChildSegmentEndIndex); Build(rightChildTreeArrayIndex, leftChildSegmentEndIndex + 1, segmentEndIndex); _treeArray[treeArrayIndex] = _treeArray[leftChildTreeArrayIndex].Combine(_treeArray[rightChildTreeArrayIndex]); }
public void Update(SumQueryObject updatedLeftChild, SumQueryObject updatedRightChild) => SumWithoutRangeAddition = updatedLeftChild.Sum + updatedRightChild.Sum;
public SumQueryObject Combine(SumQueryObject rightAdjacentObject) => new SumQueryObject( segmentStartIndex: SegmentStartIndex, segmentEndIndex: rightAdjacentObject.SegmentEndIndex, sumWithoutRangeAddition: Sum + rightAdjacentObject.Sum);