#include <iostream> #include <vector> using namespace std; int main() { int n, m, q; while (cin >> n >> m >> q) { vector<vector<long long>> vec(n + 1, vector<long long>(m + 1, 0)); vector<vector<long long>> diff(n + 2, vector<long long>(m + 2, 0)); // 读取初始数组 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> vec[i][j]; } } //以下为二维差分数组做法: for (int i = 0; i < q; i++) { int x1, y1, x2, y2, k; cin >> x1 >> y1 >> x2 >> y2 >> k; diff[x1][y1] += k; diff[x1][y2 + 1] -= k; diff[x2 + 1][y1] -= k; diff[x2 + 1][y2 + 1] += k; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { // 计算前缀和 diff[i][j]+= diff[i-1][j]+diff[i][j-1]-diff[i-1][j-1]; //这个公式怎么来的最开始没看懂,具体看https://blog.csdn.net/melonyzzZ/article/details/128448400,实际上就是求按四角调整完的diff矩阵的前缀和矩阵,一模一样 // 更新原数组 vec[i][j] += diff[i][j]; cout << vec[i][j] << ' '; } cout << endl; } //以下为简单当成m列一维差分数组进行处理,本题可通过不超时 // // 处理区间更新 // for (int i = 0; i < q; i++) { // int x1, y1, x2, y2, k; // cin >> x1 >> y1 >> x2 >> y2 >> k; // // 对每一列进行更新 // for (int j = y1; j <= y2; j++) { // diff[x1][j] += k; // if (x2 + 1 <= n ) { // diff[x2 + 1][j] -= k; // } // } // } // // 计算最终结果 // for (int i = 1; i <= n; i++) { // for (int j = 1; j <= m; j++) { // // 计算前缀和 // diff[i][j] += diff[i - 1][j]; // // 更新原数组 // vec[i][j] += diff[i][j]; // cout << vec[i][j] << ' '; // } // cout << endl; // } } return 0; }