Last Updated: 19 Mar, 2021

Matrix Range Query

Moderate
Asked in companies
AppleAmazon

Problem statement

You are given an 'N * M' matrix 'GRID'. You are also given 'Q' queries. Your task is to find the sum of the rectangular submatrix defined by the upper left corner and lower right corner for each query.

All indexes are 0 based.

Example:

'GRID' = [ [1, 2, 3],
           [4, 5, 6],
           [7, 8, 9] ]

'Q' = 1, left corner = (1, 1), right corner = (2, 2)
submatrix = [ [5, 6],
            [8, 9] ]   

Answer = 28
Input Format:
The first line of input contains an integer 'T’ denoting the number of test cases to run. Then the test case follows.

The first line of each test case contains three space-separated integers ‘N’, ‘M’, ‘Q’ number of rows and number of columns in 'GRID' and number of queries. 

Then ‘N’ lines follow. Each of the lines contains ‘M’ space-separated integers denoting the elements of the matrix 'GRID'.

Then ‘Q’ lines follow. Each of the lines contains four space-separated integers ‘X1’, ‘Y1’, ‘X2’, ‘Y2’ where (‘X1’, ‘Y1’) is an upper left corner. (‘X2’, ‘Y2’) is the lower right corner.
Output Format:
For each test case, return the array that contains sum of elements in the submatrix defined by the upper left and lower right corner for each query.
Note:
You don’t need to print anything. It has already been taken care of. Just implement the given function.
Constraints:
1 <= T <= 5
1 <= N, M <= 10^3
-10^4 <= GRID[i][j] <= 10^4

Time Limit: 1 sec

Approaches

01 Approach

We will iterate over the subgrid and calculate the sum of all elements in this subgrid of each query. 

The algorithm will be-

  1. For each query
    1. ‘SUM’ = 0
    2. For ‘ROW’ in ‘X1’ to ‘X2’
      1. For ‘COLUMN’ in ‘Y1’ to ‘Y2’
        1. ‘SUM += grid[ROW][COLUMN]'
    3. Print (SUM)

02 Approach

We will precompute the sum of the submatrix that has the upper left corner fixed at (0, 0) and represent the required submatrix as a combination of computed submatrixes.

The algorithm will be-

  1. DP[N+1][M+1], DP[i][j] stores sum of submatrix (0, 0) to (i-1, j-1)
  2. For ROW in range(N)
    1. For COLUMN in range(M)
      1. DP[ROW+1][COLUMN+1] = DP[ROW][COLUMN+1] +DP[ROW+1] [COLUMN] - DP[ROW][COLUMN] + GRID[ROW][COLUMN]
  3. For each query
    1. Print (DP [X2+1][Y2+1] -DP[X2+1][Y1] - DP[X1][Y2+1] + DP [X1][Y1])

    Eg. rectangular subgrid from (1,1) to (2,2) can be represented as.