class FenwickTree:
    def __init__(self, size):
        self.size = size
        self.tree = [0] * (size + 1)

    def update(self, index, value):
        while index <= self.size:
            self.tree[index] += value
            index += index & -index

    def range_sum(self, start, end):
        return self._prefix_sum(end) - self._prefix_sum(start - 1)

    def _prefix_sum(self, index):
        result = 0
        while index > 0:
            result += self.tree[index]
            index -= index & -index
        return result

f = FenwickTree(10)
f.update(1, 1)
f.update(2, 2)
f.update(3, 3)
f.update(4, 4)
f.update(5, 5)
f.update(6, 6)
f.update(7, 7)
f.update(8, 8)
f.update(9, 9)
f.update(10, 10)
print(f.range_sum(1, 10)) # 55
print(f.range_sum(1, 5)) # 15
print(f.range_sum(6, 10)) # 40
print(f.range_sum(3, 7)) # 25
print(f.range_sum(2, 8)) # 35
print(f.range_sum(4, 9)) # 39
print(f.range_sum(5, 5)) # 5
print(f.range_sum(1, 1)) # 1
print(f.range_sum(10, 10)) # 10

# The indices in Fenwick Tree are 1-based, 
# so be careful with off-by-one errors.