1 2 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
| from typing import List
class SegTree: def __init__(self, siz, data): self.tree = [0] * (siz*4+4) self.lazy = [0] * (siz*4+4) self.data = data
def build(self, l, r, p=1): if l == r: self.tree[p] = self.data[l-1] return mid = (l+r)//2 self.build(l, mid, p*2) self.build(mid+1, r, p*2+1) self.tree[p] = self.tree[p * 2] + self.tree[p * 2 + 1]
def push_down(self,p ,len): self.lazy[p*2] += self.lazy[p] self.lazy[p*2+1] += self.lazy[p] self.tree[p*2] += self.lazy[p] * (len- len//2) self.tree[p*2+1] += self.lazy[p] * (len//2) self.lazy[p] = 0
def query(self, l, r, ql, qr, p = 1): if qr < l or ql > r: return 0 if ql >= l and qr <= r: return self.tree[p] else: mid = (ql+qr)//2 self.push_down(p, qr-ql+1) return self.query(l,r,ql,mid,p*2) \ + self.query(l,r,mid+1,qr,p*2+1)
def update(self, l, r, ql, qr, data, p=1): if qr < l or ql > r: return if ql >= l and qr <= r: self.tree[p] += (qr-ql+1) * data if qr > ql: self.lazy[p] += data else: mid = (ql + qr) // 2 self.push_down(p,qr-ql+1) self.update(l,r,ql,mid,data,p*2) self.update(l,r,mid+1,qr,data,p*2+1)
self.tree[p] = self.tree[p * 2] + self.tree[p * 2 + 1]
class NumArray:
def __init__(self, nums: List[int]): self.tree = SegTree(len(nums), nums) self.tree.build(1,len(nums)) self.l = 1 self.r = len(nums) self.nums = nums print(self.tree.tree)
def update(self, index: int, val: int) -> None: self.tree.update(index+1,index+1,self.l,self.r,val-self.nums[index]) self.nums[index] = val
def sumRange(self, left: int, right: int) -> int: left += 1 right += 1 print(f"q {left}-{right}") return self.tree.query(left,right,self.l, self.r,1)
|