12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- type NumArray struct {
- seg []int
- l int
- }
- func Constructor(nums []int) (numArr NumArray) { // Segment tree, O(n) construction, O(logn) update, O(logn) sum range
- numArr.l = len(nums)
- numArr.seg = make([]int, 2*numArr.l)
- copy(numArr.seg[numArr.l:], nums)
- for i := numArr.l - 1; 0 < i; i-- {
- numArr.seg[i] = numArr.seg[2*i] + numArr.seg[2*i+1]
- }
- return
- }
- func (this *NumArray) Update(i int, val int) {
- i += this.l
- this.seg[i] = val
- for i = i / 2; 0 < i; i /= 2 {
- this.seg[i] = this.seg[2*i] + this.seg[2*i+1]
- }
- }
- func (this *NumArray) SumRange(i int, j int) (sum int) {
- for i, j = i+this.l, j+this.l; i < j; i, j = i/2, j/2 {
- if i%2 == 1 {
- sum += this.seg[i]
- i++
- }
- if j%2 == 0 {
- sum += this.seg[j]
- j--
- }
- }
- if i == j {
- sum += this.seg[i]
- }
- return
- }
- /**
- * Your NumArray object will be instantiated and called as such:
- * obj := Constructor(nums);
- * obj.Update(i,val);
- * param_2 := obj.SumRange(i,j);
- */
|