public SegmentTreeNode(int start, int end) { this.start = start; this.end = end; this.left = null; this.right = null; this.sum = 0; }
private void Update(SegmentTreeNode node, int index, int val) { if (node.start == node.end) { node.sum = val; } else { int mid = (node.start + node.end) / 2; if (index <= mid) { Update(node.left, index, val); } else { Update(node.right, index, val); } node.sum = node.left.sum + node.right.sum; } }
private int SumRange(SegmentTreeNode node, int start, int end) { if (node.end == end && node.start == start) { return(node.sum); } else { int mid = (node.start + node.end) / 2; if (end <= mid) { return(SumRange(node.left, start, end)); } else if (start >= mid + 1) { return(SumRange(node.right, start, end)); } else { return(SumRange(node.right, mid + 1, end) + SumRange(node.left, start, mid)); } } }
private SegmentTreeNode BuildSegmentTree(int[] nums, int start, int end) { if (start > end) { return(null); } else { SegmentTreeNode res = new SegmentTreeNode(start, end); if (start == end) { res.sum = nums[start]; } else { int mid = (start + end) / 2; res.left = BuildSegmentTree(nums, start, mid); res.right = BuildSegmentTree(nums, mid + 1, end); res.sum = res.left.sum + res.right.sum; } return(res); } }
public NumArray(int[] nums) { root = BuildSegmentTree(nums, 0, nums.Length - 1); }