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: .