-
Notifications
You must be signed in to change notification settings - Fork 353
/
Copy pathsum_of_matrix_Q_queries.cpp
120 lines (89 loc) · 2.15 KB
/
sum_of_matrix_Q_queries.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Problem - Print the sum of all submatrices of the given matrix for Q queries.
// The coordinates (start and end index) of the submatrix is given as queries
// the problem is to find the sum of those submatrices for given queries.
// Sample Input - 1
// 3 3
// 1 1 1
// 1 1 1
// 1 1 1
// 2
// 2 2
// 2 2
// 0 0
// 1 1
// Sample Output - 1
// 1
// 4
// Sample Input - 2
// 3 2
// 1 10 8
// -1 5 0
// 2
// 0 0
// 1 2
// 1 1
// 1 2
// Sample Output - 2
// 23
// 5
#include <iostream>
#include <vector>
using namespace std;
vector <vector <int>> build_prefix_sum(vector <vector <int>> grid) {
int n = grid.size() , m = grid[0].size();
vector <vector <int>> prefix_sum(n , vector <int> (m));
// Calculating the prefix sum of rows
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(j == 0)
prefix_sum[i][j] = grid[i][j];
else
prefix_sum[i][j] = prefix_sum[i][j - 1] + grid[i][j];
}
}
// Calculating the prefix sum of columns
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(i != 0)
prefix_sum[i][j] += prefix_sum[i - 1][j];
}
}
return prefix_sum;
}
int submatrix_sum(vector <vector <int>> prefix , int tl1 , int tl2 , int br1 , int br2) {
int n = prefix.size() , m = prefix[0].size();
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++)
cout << prefix[i][j] << " ";
cout << endl;
}
int sum = 0;
sum += (prefix[br1][br2]);
if(tl1 > 0 && tl2 > 0)
sum = sum - (prefix[br1][tl2 - 1] + prefix[tl1 - 1][br2]) + prefix[tl1 - 1][tl2 - 1];
else if(tl1 > 0)
sum = sum - prefix[tl1 - 1][br2];
else
sum = sum - prefix[br1][tl2 - 1];
return sum;
}
int main() {
int n , m;
cin >> n >> m;
vector <vector <int>> grid(n , vector <int> (m));
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++)
cin >> grid[i][j];
}
int q;
cin >> q;
vector <vector <int>> prefix_sum = build_prefix_sum(grid);
for(int i = 0; i < q; i++) {
int tl1 , tl2 , br1 , br2;
cin >> tl1 >> tl2;
cin >> br1 >> br2;
int sum = submatrix_sum(prefix_sum , tl1 , tl2 , br1 , br2);
cout << sum << endl;
}
return 0;
}