# a[i] 增加 val # 1 <= i <= n # 时间复杂度 O(log n) defupdate(self, i: int, val: int) -> None: t = self.tree while i < len(t): t[i] += val i += i & -i
# 计算前缀和 a[1] + ... + a[i] # 1 <= i <= n # 时间复杂度 O(log n) defpre(self, i: int) -> int: t = self.tree res = 0 while i > 0: res += t[i] i &= i - 1 return res
# 计算区间和 a[l] + ... + a[r] # 1 <= l <= r <= n # 时间复杂度 O(log n) defquery(self, l: int, r: int) -> int: if r < l: return0 returnself.pre(r) - self.pre(l - 1)
def__init__(self, nums: List[int]): n = len(nums) self.nums = [0] * n # 使 update 中算出的 delta = nums[i] self.tree = [0] * (n + 1) for i, x inenumerate(nums): self.update(i, x)
defupdate(self, index: int, val: int) -> None: delta = val - self.nums[index] self.nums[index] = val i = index + 1 while i < len(self.tree): self.tree[i] += delta i += i & -i
defprefixSum(self, i: int) -> int: s = 0 while i: s += self.tree[i] i &= i - 1# i -= i & -i 的另一种写法 return s
def__init__(self, nums: List[int]): n = len(nums) tree = [0] * (n + 1) for i, x inenumerate(nums, 1): # i 从 1 开始 tree[i] += x nxt = i + (i & -i) # 下一个关键区间的右端点 if nxt <= n: tree[nxt] += tree[i] self.nums = nums self.tree = tree
defupdate(self, index: int, val: int) -> None: delta = val - self.nums[index] self.nums[index] = val i = index + 1 while i < len(self.tree): self.tree[i] += delta i += i & -i
defprefixSum(self, i: int) -> int: s = 0 while i: s += self.tree[i] i &= i - 1# i -= i & -i 的另一种写法 return s