@@ -33,6 +33,7 @@ def update_value(input, segment_tree, new_value, index):
33
33
input [index ] = new_value
34
34
update_value_util (segment_tree , 0 , len (input )- 1 , diff , index , 0 )
35
35
36
+
36
37
def update_value_util (segment_tree , low , high , diff , index , pos ):
37
38
if low > index or high < index :
38
39
return
@@ -44,6 +45,36 @@ def update_value_util(segment_tree, low, high, diff, index, pos):
44
45
update_value_util (segment_tree , low , mid , diff , index , 2 * pos + 1 )
45
46
update_value_util (segment_tree , mid + 1 , high , diff , index , 2 * pos + 2 )
46
47
48
+ def updateRange (int n , int us , int ue , int diff ):
49
+ updateRangeUtil (0 , 0 , n - 1 , us , ue , diff )
50
+
51
+ lazy = [0 ]* 1000
52
+
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 ]
59
+
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 ]
47
78
48
79
def next_power_of_2 (n ):
49
80
if n == 0 :
@@ -65,3 +96,4 @@ def next_power_of_2(n):
65
96
print (segment_tree )
66
97
print (sum_range_query (segment_tree , 2 , 5 , len (input )))
67
98
print (sum_range_query (segment_tree , 1 , 3 , len (input )))
99
+ updateRange (len (input ), 1 , 5 , 10 )
0 commit comments