Ejemplo n.º 1
0
 public SegmentTreeNode(int start, int end)
 {
     this.start = start;
     this.end   = end;
     this.left  = null;
     this.right = null;
     this.sum   = 0;
 }
Ejemplo n.º 2
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;
     }
 }
Ejemplo n.º 3
0
 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));
         }
     }
 }
Ejemplo n.º 4
0
 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);
     }
 }
Ejemplo n.º 5
0
 public NumArray(int[] nums)
 {
     root = BuildSegmentTree(nums, 0, nums.Length - 1);
 }