MCPcopy Create free account
hub / github.com/TheAlgorithms/Python / SegmentTree

Class SegmentTree

data_structures/binary_tree/lazy_segment_tree.py:6–122  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4
5
6class SegmentTree:
7 def __init__(self, size: int) -> None:
8 self.size = size
9 # approximate the overall size of segment tree with given value
10 self.segment_tree = [0 for i in range(4 * size)]
11 # create array to store lazy update
12 self.lazy = [0 for i in range(4 * size)]
13 self.flag = [0 for i in range(4 * size)] # flag for lazy update
14
15 def left(self, idx: int) -> int:
16 """
17 >>> segment_tree = SegmentTree(15)
18 >>> segment_tree.left(1)
19 2
20 >>> segment_tree.left(2)
21 4
22 >>> segment_tree.left(12)
23 24
24 """
25 return idx * 2
26
27 def right(self, idx: int) -> int:
28 """
29 >>> segment_tree = SegmentTree(15)
30 >>> segment_tree.right(1)
31 3
32 >>> segment_tree.right(2)
33 5
34 >>> segment_tree.right(12)
35 25
36 """
37 return idx * 2 + 1
38
39 def build(
40 self, idx: int, left_element: int, right_element: int, a: list[int]
41 ) -> None:
42 if left_element == right_element:
43 self.segment_tree[idx] = a[left_element - 1]
44 else:
45 mid = (left_element + right_element) // 2
46 self.build(self.left(idx), left_element, mid, a)
47 self.build(self.right(idx), mid + 1, right_element, a)
48 self.segment_tree[idx] = max(
49 self.segment_tree[self.left(idx)], self.segment_tree[self.right(idx)]
50 )
51
52 def update(
53 self, idx: int, left_element: int, right_element: int, a: int, b: int, val: int
54 ) -> bool:
55 """
56 update with O(lg n) (Normal segment tree without lazy update will take O(nlg n)
57 for each update)
58
59 update(1, 1, size, a, b, v) for update val v to [a,b]
60 """
61 if self.flag[idx] is True:
62 self.segment_tree[idx] = self.lazy[idx]
63 self.flag[idx] = False

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected