Fenwick Tree
from unittest import TestCase
class Fenwick:
def __init__(self, n):
self.n = n
self.tree = [0] * (n + 1)
def add(self, i, delta):
while i <= self.n:
self.tree[i] += delta
i += i & -i
def sum(self, i):
res = 0
while i > 0:
res += self.tree[i]
i -= i & -i
return res
def sum_range(self, i, j):
return self.sum(j) - self.sum(i - 1)
class TestFenwick(TestCase):
def test_fenwick(self):
tree = Fenwick(10)
tree.add(1, 1)
tree.add(2, 2)
tree.add(3, 3)
self.assertEqual(tree.sum(1), 1)
self.assertEqual(tree.sum(2), 3)
self.assertEqual(tree.sum(3), 6)
self.assertEqual(tree.sum(2, 3), 5)
tree.add(1, 100)
self.assertEqual(tree.sum(3), 106)