Data Structures19 sections · 729 units
Open in Course

Range Update Range Query

Two BITs working together

What if you need both range updates AND range queries?

Use two BITs. After adding δ\delta to range [l,r][l, r], the prefix sum at position ii increases by:

  • 00 if i<li < l
  • δ(il+1)\delta \cdot (i - l + 1) if lirl \leq i \leq r
  • δ(rl+1)\delta \cdot (r - l + 1) if i>ri > r

This can be decomposed into: prefix(i)=B1(i)iB0(i)\text{prefix}(i) = B_1(i) \cdot i - B_0(i)

where B1B_1 and B0B_0 are two BITs updated together.

def rangeAdd(l, r, delta):
    add(B1, l, delta)
    add(B1, r + 1, -delta)
    add(B0, l, delta * (l - 1))
    add(B0, r + 1, -delta * r)

def prefixSum(i):
    return query(B1, i) * i - query(B0, i)

This achieves O(logn)O(\log n) for both range update and range query.