307.range-sum-query-mutable.go 950 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. type NumArray struct {
  2. seg []int
  3. l int
  4. }
  5. func Constructor(nums []int) (numArr NumArray) { // Segment tree, O(n) construction, O(logn) update, O(logn) sum range
  6. numArr.l = len(nums)
  7. numArr.seg = make([]int, 2*numArr.l)
  8. copy(numArr.seg[numArr.l:], nums)
  9. for i := numArr.l - 1; 0 < i; i-- {
  10. numArr.seg[i] = numArr.seg[2*i] + numArr.seg[2*i+1]
  11. }
  12. return
  13. }
  14. func (this *NumArray) Update(i int, val int) {
  15. i += this.l
  16. this.seg[i] = val
  17. for i = i / 2; 0 < i; i /= 2 {
  18. this.seg[i] = this.seg[2*i] + this.seg[2*i+1]
  19. }
  20. }
  21. func (this *NumArray) SumRange(i int, j int) (sum int) {
  22. for i, j = i+this.l, j+this.l; i < j; i, j = i/2, j/2 {
  23. if i%2 == 1 {
  24. sum += this.seg[i]
  25. i++
  26. }
  27. if j%2 == 0 {
  28. sum += this.seg[j]
  29. j--
  30. }
  31. }
  32. if i == j {
  33. sum += this.seg[i]
  34. }
  35. return
  36. }
  37. /**
  38. * Your NumArray object will be instantiated and called as such:
  39. * obj := Constructor(nums);
  40. * obj.Update(i,val);
  41. * param_2 := obj.SumRange(i,j);
  42. */