Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Ftree:
- def __init__(self, n):
- self.n = n
- self.tree1 = (n+1)*[0]
- self.tree2 = (n+1)*[0]
- def query(self, tree, r):
- s = 0
- while r > 0:
- s += tree[r]
- r -= r & -r
- return s
- def sum(self, r):
- return self.query(self.tree1, r)*r - self.query(self.tree2, r)
- def sum_range(self, l, r):
- return self.sum(r) - self.sum(l-1)
- def add(self, tree, k, x):
- while k <= self.n:
- tree[k] += x
- k += k & -k
- def add_range(self, l, r, x):
- self.add(self.tree1, l, x)
- self.add(self.tree1, r+1, -x)
- self.add(self.tree2, l, x*(l-1))
- self.add(self.tree2, r+1, -x *r)
- # Initial array
- a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- # Fenwick Tree
- t = Ftree(10)
- for i in range(10):
- # Adding data to tree
- t.add_range(i+1, i+1, a[i])
- # Query range sum
- print(t.sum_range(5, 9)) # 35
- # Adding value to range
- t.add_range(5, 9, 2)
- print(t.sum_range(5, 9)) # 45
- t.add_range(5, 6, 1)
- print(t.sum_range(5, 9)) # 47
Advertisement
Add Comment
Please, Sign In to add comment