|
@@ -0,0 +1,46 @@
|
|
|
+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);
|
|
|
+ */
|