2D update

void update(int x, int y, int delta) {
  for (int i = x; i <= n; i += i & -i)
    for (int j = y; j <= m; j += j & -j)
      bit[i][j] += delta;
}
Advertisement

2D prefix

long query(int x, int y) {
  long sum = 0;
  for (int i = x; i > 0; i -= i & -i)
    for (int j = y; j > 0; j -= j & -j)
      sum += bit[i][j];
  return sum;
}
Advertisement

Rectangle sum

sum(x1,y1,x2,y2) = query(x2,y2) - query(x1-1,y2) - query(x2,y1-1) + query(x1-1,y1-1).

Range update 2D

Extend 1D difference-array trick to 2D. Four BITs needed. Complex.