Submatrix Sum Queries - GeeksforGeeks
Given a matrix of size M x N, there are large number of queries to find submatrix sums. Inputs to queries are left top and right bottom indexes of submatrix whose sum is to find out.
How to preprocess the matrix so that submatrix sum queries can be performed in O(1) time.
Read full article from Submatrix Sum Queries - GeeksforGeeks
Given a matrix of size M x N, there are large number of queries to find submatrix sums. Inputs to queries are left top and right bottom indexes of submatrix whose sum is to find out.
How to preprocess the matrix so that submatrix sum queries can be performed in O(1) time.
How to build aux[M][N]?
1. Copy first row of mat[][] to aux[][]
2. Do column wise sum of the matrix and store it.
3. Do the row wise sum of updated matrix aux[][] in step 2.
1. Copy first row of mat[][] to aux[][]
2. Do column wise sum of the matrix and store it.
3. Do the row wise sum of updated matrix aux[][] in step 2.
// Function to preprcess input mat[M][N]. This function// mainly fills aux[M][N] such that aux[i][j] stores sum// of elements from (0,0) to (i,j)int preProcess(int mat[M][N], int aux[M][N]){ // Copy first row of mat[][] to aux[][] for (int i=0; i<N; i++) aux[0][i] = mat[0][i]; // Do column wise sum for (int i=1; i<M; i++) for (int j=0; j<N; j++) aux[i][j] = mat[i][j] + aux[i-1][j]; // Do row wise sum for (int i=0; i<M; i++) for (int j=1; j<N; j++) aux[i][j] += aux[i][j-1];}// A O(1) time function to compute sum of submatrix// between (tli, tlj) and (rbi, rbj) using aux[][]// which is built by the preprocess functionint sumQuery(int aux[M][N], int tli, int tlj, int rbi, int rbj){ // result is now sum of elements between (0, 0) and // (rbi, rbj) int res = aux[rbi][rbj]; // Remove elements between (0, 0) and (tli-1, rbj) if (tli > 0) res = res - aux[tli-1][rbj]; // Remove elements between (0, 0) and (rbi, tlj-1) if (tlj > 0) res = res - aux[rbi][tlj-1]; // Add aux[tli-1][tlj-1] as elements between (0, 0) // and (tli-1, tlj-1) are subtracted twice if (tli > 0 && tlj > 0) res = res + aux[tli-1][tlj-1]; return res;}