1
+ """
2
+ @author: shakeelsamsu
3
+ https://gihtub.com/shakeelsamsu
4
+ Oct 7 18 9:42:35 PM
5
+ """
6
+
7
+ class fenwick :
8
+ """Fenwick Tree"""
9
+
10
+ #def __init__(self, list):
11
+ # """Initialize BIT with list in O(n*log(n))"""
12
+ # self.array = [0] * (len(list) + 1)
13
+ # for idx, val in enumerate(list):
14
+ # self.update(idx, val)
15
+
16
+ def __init__ (self , list ):
17
+ """"Initialize BIT with list in O(n)"""
18
+ self .array = [0 ] + list
19
+ for idx in range (1 , len (self .array )):
20
+ idx2 = idx + (idx & - idx )
21
+ if idx2 < len (self .array ):
22
+ self .array [idx2 ] += self .array [idx ]
23
+
24
+ def prefix_query (self , idx ):
25
+ """Computes prefix sum of up to including the idx-th element"""
26
+ idx += 1
27
+ result = 0
28
+ while idx :
29
+ result += self .array [idx ]
30
+ idx -= idx & - idx
31
+ return result
32
+
33
+ def range_query (self , from_idx , to_idx ):
34
+ """Computes the range sum between two indices (both inclusive)"""
35
+ return self .prefix_query (to_idx ) - self .prefix_query (from_idx - 1 )
36
+
37
+ def update (self , idx , add ):
38
+ """Add a value to the idx-th element"""
39
+ idx += 1
40
+ while idx < len (self .array ):
41
+ self .array [idx ] += add
42
+ idx += idx & - idx
43
+
44
+
45
+ if __name__ == '__main__' :
46
+ array = [1 , 7 , 3 , 0 , 5 , 8 , 3 , 2 , 6 , 2 , 1 , 1 , 4 , 5 ]
47
+ bit = fenwick (array )
48
+ print ('Array: [{}]' .format (', ' .join (map (str , array ))))
49
+ print ()
50
+
51
+ print ('Prefix sum of first {} elements: {}' .format (13 , bit .prefix_query (12 )))
52
+ print ('Prefix sum of first {} elements: {}' .format (7 , bit .prefix_query (6 )))
53
+ print ('Range sum from pos {} to pos {}: {}' .format (1 , 5 , bit .range_query (1 , 5 )))
54
+ print ()
55
+
56
+ bit .update (4 , 2 )
57
+ print ('Add {} to element at pos {}' .format (2 , 4 ))
58
+ new_array = [bit .range_query (idx , idx ) for idx in range (len (array ))]
59
+ print ('Array: [{}]' .format (', ' .join (map (str , new_array ))))
60
+ print ()
61
+
62
+ print ('Prefix sum of first {} elements: {}' .format (13 , bit .prefix_query (12 )))
63
+ print ('Prefix sum of first {} elements: {}' .format (7 , bit .prefix_query (6 )))
64
+ print ('Range sum from pos {} to pos {}: {}' .format (1 , 5 , bit .range_query (1 , 5 )))
65
+ print ()
0 commit comments