3
3
4
4
5
5
class SegmentTree :
6
- def __init__ (self , N : int ) -> None :
7
- self .N = N
8
- # approximate the overall size of segment tree with array N
9
- self .st : List [ int ] = [0 for i in range (0 , 4 * N )]
6
+ def __init__ (self , size : int ) -> None :
7
+ self .size = size
8
+ # approximate the overall size of segment tree with given value
9
+ self .segment_tree = [0 for i in range (0 , 4 * size )]
10
10
# create array to store lazy update
11
- self .lazy : List [ int ] = [0 for i in range (0 , 4 * N )]
12
- self .flag : List [ int ] = [0 for i in range (0 , 4 * N )] # flag for lazy update
11
+ self .lazy = [0 for i in range (0 , 4 * size )]
12
+ self .flag = [0 for i in range (0 , 4 * size )] # flag for lazy update
13
13
14
14
def left (self , idx : int ) -> int :
15
15
"""
@@ -39,24 +39,26 @@ def build(
39
39
self , idx : int , left_element : int , right_element : int , A : List [int ]
40
40
) -> None :
41
41
if left_element == right_element :
42
- self .st [idx ] = A [left_element - 1 ]
42
+ self .segment_tree [idx ] = A [left_element - 1 ]
43
43
else :
44
44
mid = (left_element + right_element ) // 2
45
45
self .build (self .left (idx ), left_element , mid , A )
46
46
self .build (self .right (idx ), mid + 1 , right_element , A )
47
- self .st [idx ] = max (self .st [self .left (idx )], self .st [self .right (idx )])
47
+ self .segment_tree [idx ] = max (
48
+ self .segment_tree [self .left (idx )], self .segment_tree [self .right (idx )]
49
+ )
48
50
49
51
def update (
50
52
self , idx : int , left_element : int , right_element : int , a : int , b : int , val : int
51
53
) -> bool :
52
54
"""
53
- update with O(lg N ) (Normal segment tree without lazy update will take O(Nlg N )
55
+ update with O(lg n ) (Normal segment tree without lazy update will take O(nlg n )
54
56
for each update)
55
57
56
- update(1, 1, N , a, b, v) for update val v to [a,b]
58
+ update(1, 1, size , a, b, v) for update val v to [a,b]
57
59
"""
58
60
if self .flag [idx ] is True :
59
- self .st [idx ] = self .lazy [idx ]
61
+ self .segment_tree [idx ] = self .lazy [idx ]
60
62
self .flag [idx ] = False
61
63
if left_element != right_element :
62
64
self .lazy [self .left (idx )] = self .lazy [idx ]
@@ -67,7 +69,7 @@ def update(
67
69
if right_element < a or left_element > b :
68
70
return True
69
71
if left_element >= a and right_element <= b :
70
- self .st [idx ] = val
72
+ self .segment_tree [idx ] = val
71
73
if left_element != right_element :
72
74
self .lazy [self .left (idx )] = val
73
75
self .lazy [self .right (idx )] = val
@@ -77,15 +79,17 @@ def update(
77
79
mid = (left_element + right_element ) // 2
78
80
self .update (self .left (idx ), left_element , mid , a , b , val )
79
81
self .update (self .right (idx ), mid + 1 , right_element , a , b , val )
80
- self .st [idx ] = max (self .st [self .left (idx )], self .st [self .right (idx )])
82
+ self .segment_tree [idx ] = max (
83
+ self .segment_tree [self .left (idx )], self .segment_tree [self .right (idx )]
84
+ )
81
85
return True
82
86
83
- # query with O(lg N )
87
+ # query with O(lg n )
84
88
def query (
85
89
self , idx : int , left_element : int , right_element : int , a : int , b : int
86
90
) -> int :
87
91
"""
88
- query(1, 1, N , a, b) for query max of [a,b]
92
+ query(1, 1, size , a, b) for query max of [a,b]
89
93
>>> A = [1, 2, -4, 7, 3, -5, 6, 11, -20, 9, 14, 15, 5, 2, -8]
90
94
>>> segment_tree = SegmentTree(15)
91
95
>>> segment_tree.build(1, 1, 15, A)
@@ -97,7 +101,7 @@ def query(
97
101
15
98
102
"""
99
103
if self .flag [idx ] is True :
100
- self .st [idx ] = self .lazy [idx ]
104
+ self .segment_tree [idx ] = self .lazy [idx ]
101
105
self .flag [idx ] = False
102
106
if left_element != right_element :
103
107
self .lazy [self .left (idx )] = self .lazy [idx ]
@@ -107,28 +111,25 @@ def query(
107
111
if right_element < a or left_element > b :
108
112
return - math .inf
109
113
if left_element >= a and right_element <= b :
110
- return self .st [idx ]
114
+ return self .segment_tree [idx ]
111
115
mid = (left_element + right_element ) // 2
112
116
q1 = self .query (self .left (idx ), left_element , mid , a , b )
113
117
q2 = self .query (self .right (idx ), mid + 1 , right_element , a , b )
114
118
return max (q1 , q2 )
115
119
116
- def show_data (self ) -> None :
117
- showList = []
118
- for i in range (1 , N + 1 ):
119
- showList += [self .query (1 , 1 , self .N , i , i )]
120
- print (showList )
120
+ def __str__ (self ) -> None :
121
+ return [self .query (1 , 1 , self .size , i , i ) for i in range (1 , self .size + 1 )]
121
122
122
123
123
124
if __name__ == "__main__" :
124
125
A = [1 , 2 , - 4 , 7 , 3 , - 5 , 6 , 11 , - 20 , 9 , 14 , 15 , 5 , 2 , - 8 ]
125
- N = 15
126
- segt = SegmentTree (N )
127
- segt .build (1 , 1 , N , A )
128
- print (segt .query (1 , 1 , N , 4 , 6 ))
129
- print (segt .query (1 , 1 , N , 7 , 11 ))
130
- print (segt .query (1 , 1 , N , 7 , 12 ))
131
- segt .update (1 , 1 , N , 1 , 3 , 111 )
132
- print (segt .query (1 , 1 , N , 1 , 15 ))
133
- segt .update (1 , 1 , N , 7 , 8 , 235 )
134
- segt . show_data ( )
126
+ size = 15
127
+ segt = SegmentTree (size )
128
+ segt .build (1 , 1 , size , A )
129
+ print (segt .query (1 , 1 , size , 4 , 6 ))
130
+ print (segt .query (1 , 1 , size , 7 , 11 ))
131
+ print (segt .query (1 , 1 , size , 7 , 12 ))
132
+ segt .update (1 , 1 , size , 1 , 3 , 111 )
133
+ print (segt .query (1 , 1 , size , 1 , 15 ))
134
+ segt .update (1 , 1 , size , 7 , 8 , 235 )
135
+ print ( segt )
0 commit comments