@@ -45,36 +45,13 @@ def update_value_util(segment_tree, low, high, diff, index, pos):
45
45
update_value_util (segment_tree , low , mid , diff , index , 2 * pos + 1 )
46
46
update_value_util (segment_tree , mid + 1 , high , diff , index , 2 * pos + 2 )
47
47
48
- def updateRange ( int n , int us , int ue , int diff ):
49
- updateRangeUtil ( 0 , 0 , n - 1 , us , ue , diff )
48
+ def updateSegmentTreeRangeLazy ( input , segmentTree , lazy , startRange , endRange , delta ):
49
+ updateSegmentTreeRangeLazy ( segmentTree , lazy , startRange , endRange , delta , 0 , input . length - 1 , 0 )
50
50
51
- lazy = [0 ]* 1000
52
51
53
- def updateRangeUtil ( si , ss , se , us , ue , diff ):
54
- if (lazy [si ] != 0 ):
55
- tree [si ] += (se - ss + 1 )* lazy [si ]
56
- if (ss != se ):
57
- lazy [si * 2 + 1 ] += lazy [si ]
58
- lazy [si * 2 + 2 ] += lazy [si ]
52
+ def rangeMinimumQueryLazy (segmentTree , lazy , qlow , qhigh , leni ):
53
+ return rangeMinimumQueryLazy (segmentTree , lazy , qlow , qhigh , 0 , leni - 1 , 0 )
59
54
60
- lazy [si ] = 0
61
-
62
- if (ss > se | | ss > ue | | se < us )
63
- return
64
-
65
- if (ss >= us & & se <= ue ):
66
- tree [si ] += (se - ss + 1 )* diff
67
-
68
- if (ss != se ):
69
- lazy [si * 2 + 1 ] += diff
70
- lazy [si * 2 + 2 ] += diff
71
- return
72
-
73
- int mid = (ss + se )/ 2
74
- updateRangeUtil (si * 2 + 1 , ss , mid , us , ue , diff )
75
- updateRangeUtil (si * 2 + 2 , mid + 1 , se , us , ue , diff )
76
-
77
- tree [si ] = tree [si * 2 + 1 ] + tree [si * 2 + 2 ]
78
55
79
56
def next_power_of_2 (n ):
80
57
if n == 0 :
@@ -85,6 +62,57 @@ def next_power_of_2(n):
85
62
n &= (n - 1 )
86
63
return n << 1
87
64
65
+ def updateSegmentTreeRangeLazy (segmentTree , lazy , startRange , endRange , delta , low , high , pos ):
66
+ if (low > high ):
67
+ return
68
+
69
+ if (lazy [pos ] != 0 ):
70
+ segmentTree [pos ] += lazy [pos ]
71
+ if (low != high ):
72
+ lazy [2 * pos + 1 ] += lazy [pos ]
73
+ lazy [2 * pos + 2 ] += lazy [pos ]
74
+ lazy [pos ] = 0
75
+
76
+ if (startRange > high | | endRange < low ):
77
+ return
78
+
79
+ if (startRange <= low & & endRange >= high ):
80
+ segmentTree [pos ] += delta
81
+ if (low != high ):
82
+ lazy [2 * pos + 1 ] += delta
83
+ lazy [2 * pos + 2 ] += delta
84
+ return
85
+
86
+ int mid = (low + high )/ 2
87
+ updateSegmentTreeRangeLazy (segmentTree , lazy , startRange , endRange ,delta , low , mid , 2 * pos + 1 )
88
+ updateSegmentTreeRangeLazy (segmentTree , lazy , startRange , endRange ,delta , mid + 1 , high , 2 * pos + 2 )
89
+ segmentTree [pos ] = Math .min (segmentTree [2 * pos + 1 ], segmentTree [2 * pos + 2 ])
90
+
91
+ def rangeMinimumQueryLazy (int segmentTree , int lazy [], int qlow , int qhigh , low , int high , int pos ):
92
+ if (low > high ):
93
+ return Integer .MAX_VALUE
94
+
95
+ if (lazy [pos ] != 0 )
96
+ segmentTree [pos ] + = lazy [pos ]
97
+ if (low != high ):
98
+ lazy [2 * pos + 1 ] += lazy [pos ]
99
+ lazy [2 * pos + 2 ] += lazy [pos ]
100
+ lazy [pos ] = 0
101
+
102
+ if (qlow > high | | qhigh < low ):
103
+ return Integer .MAX_VALUE
104
+
105
+ if (qlow <= low & & qhigh >= high ):
106
+ return segmentTree [pos ]
107
+
108
+ int mid = (low + high )/ 2
109
+ return Math .min (rangeMinimumQueryLazy (segmentTree , lazy , qlow , qhigh ,
110
+ low , mid , 2 * pos + 1 ),
111
+ rangeMinimumQueryLazy (segmentTree , lazy , qlow , qhigh ,
112
+ mid + 1 , high , 2 * pos + 2 ))
113
+
114
+
115
+
88
116
if __name__ == '__main__' :
89
117
input = [1 ,3 ,5 ,7 ,9 ,11 ]
90
118
segment_tree = create_segment_tree (input )
@@ -97,3 +125,11 @@ def next_power_of_2(n):
97
125
print (sum_range_query (segment_tree , 2 , 5 , len (input )))
98
126
print (sum_range_query (segment_tree , 1 , 3 , len (input )))
99
127
updateRange (len (input ), 1 , 5 , 10 )
128
+
129
+ #lazy propagation example
130
+ input1 = [- 1 ,2 ,4 ,1 ,7 ,1 ,3 ,2 ]
131
+ segTree1 = create_segment_tree (input )
132
+ lazy1 = []
133
+ updateSegmentTreeRangeLazy (input1 , segTree1 , lazy1 , 0 , 3 , 1 )
134
+ updateSegmentTreeRangeLazy (input1 , segTree1 , lazy1 , 0 , 0 , 2 )
135
+ print (1 == rangeMinimumQueryLazy (segTree1 , lazy1 , 3 , 5 , input1 .length ))
0 commit comments