classSegTree: def__init__(self, n, arr=None): self.seg_len = self.get_seglen(n) self.arr = [0] * self.seg_len * 2 if arr: for i, v inenumerate(arr): self.add(i, v)
defadd(self, i, val): i += self.seg_len self.arr[i] += val whileTrue: i >>= 1 if i == 0: break self.arr[i] = self.arr[i*2] + self.arr[i*2+1]
defsum(self, l, r): l += self.seg_len r += self.seg_len ans = 0 while l < r: if l & 1: ans += self.arr[l] l += 1 l >>= 1 if r & 1: ans += self.arr[r-1] r -= 1 r >>= 1 return ans
@staticmethod defget_seglen(n): log2_n = 0 while n: log2_n += 1 n >>= 1 return1 << log2_n