Skip to content

Commit 93d1dd9

Browse files
committed
update with lazy propogation
1 parent 91ee4fe commit 93d1dd9

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

tree/segmenttreesum.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def update_value(input, segment_tree, new_value, index):
3333
input[index] = new_value
3434
update_value_util(segment_tree, 0, len(input)-1, diff, index, 0)
3535

36+
3637
def update_value_util(segment_tree, low, high, diff, index, pos):
3738
if low > index or high < index:
3839
return
@@ -44,6 +45,36 @@ def update_value_util(segment_tree, low, high, diff, index, pos):
4445
update_value_util(segment_tree, low, mid, diff, index, 2*pos + 1)
4546
update_value_util(segment_tree, mid + 1, high, diff, index, 2*pos + 2)
4647

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]
4778

4879
def next_power_of_2(n):
4980
if n == 0:
@@ -65,3 +96,4 @@ def next_power_of_2(n):
6596
print(segment_tree)
6697
print(sum_range_query(segment_tree, 2, 5, len(input)))
6798
print(sum_range_query(segment_tree, 1, 3, len(input)))
99+
updateRange(len(input), 1, 5, 10)

0 commit comments

Comments
 (0)