Data Structures19 sections · 729 units
Open in Course

Lazy Block Updates

Implementation details

Here's range add with lazy blocks:

function rangeAdd(l, r, v, arr, blockAdd, B)
    blockL := floor(l / B)
    blockR := floor(r / B)

    if blockL = blockR then
        for i from l to r
            arr[i] := arr[i] + v
        return

    // Left tail
    for i from l to (blockL + 1) * B - 1
        arr[i] := arr[i] + v

    // Complete blocks
    for b from blockL + 1 to blockR - 1
        blockAdd[b] := blockAdd[b] + v

    // Right tail
    for i from blockR * B to r
        arr[i] := arr[i] + v

Point query: arr[i]+blockAdd[i/B]arr[i] + blockAdd[\lfloor i/B \rfloor].