Data Structures19 sections · 729 units
Open in Course

Range Set Operation

Overwriting instead of adding

"Set all elements in [l,r][l, r] to value vv" is different from "add vv to range."

For range set, the lazy value represents "set to this value," not "add this value." Use a sentinel (like -\infty or None) to indicate "no pending set."

def rangeSet(node, start, end, l, r, val):
    if r < start or end < l:
        return
    if l <= start and end <= r:
        tree[node] = val * (end - start + 1)
        lazy[node] = val
        return
    pushDown(node, start, end)
    mid = (start + end) // 2
    rangeSet(2*node, start, mid, l, r, val)
    rangeSet(2*node+1, mid+1, end, l, r, val)
    tree[node] = tree[2*node] + tree[2*node+1]

The push down for "set" overwrites children's values and lazy, rather than adding to them.