package com.interview.multiarray;
/**
*
* Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner
* (row1, col1) and lower right corner (row2, col2).
*
* https://leetcode.com/problems/range-sum-query-2d-mutable/
*/
public class Mutable2DSumRangeQuery {
private int[][] prefixSum;
private int rows;
private int cols;
private int[][] matrix;
public Mutable2DSumRangeQuery(int[][] matrix) {
if (matrix.length == 0) {
return;
}
prefixSum = new int[matrix.length][matrix[0].length + 1];
this.matrix = matrix;
rows = matrix.length;
cols = matrix[0].length;
for (int i = 0; i < rows; i++) {
for (int j = 1; j <= cols; j++) {
prefixSum[i][j] = prefixSum[i][j - 1] + matrix[i][j - 1];
}
}
}
public void update(int row, int col, int val) {
int delta = val - matrix[row][col];
matrix[row][col] = val;
for (int i = col + 1; i <= cols; i++) {
prefixSum[row][i] += delta;
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
int sum = 0;
for (int i = row1; i <= row2; i++) {
sum += prefixSum[i][col2 + 1] - prefixSum[i][col1];
}
return sum;
}
}