Here's the range sum query:
function rangeSum(l, r, arr, blockSum, B)
blockL := floor(l / B)
blockR := floor(r / B)
if blockL = blockR then
// Same block - iterate directly
sum := 0
for i from l to r
sum := sum + arr[i]
return sum
sum := 0
// Left tail
for i from l to (blockL + 1) * B - 1
sum := sum + arr[i]
// Complete blocks
for b from blockL + 1 to blockR - 1
sum := sum + blockSum[b]
// Right tail
for i from blockR * B to r
sum := sum + arr[i]
return sum
Time: . Space: for block sums.