| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 
 | type NumArray struct {leftNumArray *NumArray
 rightNumArray *NumArray
 left int
 right int
 sum int
 }
 
 func Constructor(nums []int) NumArray {
 return *dfs(nums, 0, len(nums) - 1)
 }
 
 func dfs(nums []int, left, right int) *NumArray {
 if left == right {
 return &NumArray{
 leftNumArray: nil,
 rightNumArray: nil,
 left: left,
 right: right,
 sum: nums[left],
 }
 }
 mid := ((right - left) >> 1) + left
 leftNumArray := dfs(nums, left, mid)
 rightNumArray := dfs(nums, mid + 1, right)
 return &NumArray{
 leftNumArray: leftNumArray,
 rightNumArray: rightNumArray,
 left: left,
 right: right,
 sum: leftNumArray.sum + rightNumArray.sum,
 }
 }
 
 func queryRange(numArray *NumArray, left, right int) int {
 if numArray.left == left && numArray.right == right {
 return numArray.sum
 }
 mid := ((numArray.right - numArray.left) >> 1) + numArray.left
 if left > mid {
 return queryRange(numArray.rightNumArray, left, right)
 } else if right <= mid {
 return queryRange(numArray.leftNumArray, left, right)
 }
 return queryRange(numArray.leftNumArray, left, mid) + queryRange(numArray.rightNumArray, mid + 1, right)
 }
 
 func updateRange(numArray *NumArray, left, right, val int) *NumArray {
 if numArray.left == numArray.right && numArray.left == left {
 numArray.sum = val
 return numArray
 }
 mid := ((numArray.right - numArray.left) >> 1) + numArray.left
 if left > mid {
 updateRange(numArray.rightNumArray, left, right, val)
 } else if right <= mid {
 updateRange(numArray.leftNumArray, left, right, val)
 } else {
 updateRange(numArray.leftNumArray, left, mid, val)
 updateRange(numArray.rightNumArray, mid + 1, right, val)
 }
 numArray.sum = numArray.leftNumArray.sum + numArray.rightNumArray.sum
 return numArray
 }
 
 func (this *NumArray) Update(index int, val int)  {
 updateRange(this, index, index, val)
 }
 
 func (this *NumArray) SumRange(left int, right int) int {
 return queryRange(this, left, right)
 }
 
 /**
 * Your NumArray object will be instantiated and called as such:
 * obj := Constructor(nums);
 * obj.Update(index,val);
 * param_2 := obj.SumRange(left,right);
 */
 
 |