class RangeUpdateFenwickTree:
def __init__(self, n):
self.size = n
self.tree = [0] * (n + 1)
self.tree2 = [0] * (n + 1) # For handling range updates
def _update(self, index, value, tree):
while index <= self.size:
tree[index] += value
index += index & (-index)
def range_update(self, left, right, value):
"""Add value to range [left, right]"""
self._update(left + 1, value, self.tree)
self._update(right + 2, -value, self.tree)
self._update(left + 1, value * left, self.tree2)
self._update(right + 2, -value * (right + 1), self.tree2)
def _query(self, index, tree):
total = 0
while index > 0:
total += tree[index]
index -= index & (-index)
return total
def get(self, index):
"""Get value at index"""
index += 1
return self._query(index, self.tree) * index - self._query(index, self.tree2)