类比成一维即可,处理方法是一样的
先用公式a[i][j]=s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1]来预处理差分数组,再通过差分数组来修改,用公式a[x1][y1]+=c,a[x2+1][y1]-=c,a[x1][y2+1]-=c,a[x2+1][y2+1]+=c,最后输出的时候用前缀和预处理一波即可
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;}
int i,j,q,n,m;
const int N = 1010;
int a[N][N],s[N][N];//a[N][N],为差分
int main()
{
n=read(),m=read(),q=read();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
s[i][j]=read(),a[i][j]=s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1];//读入+预处理
while(q--){
int x1=read();int y1=read();int x2=read();int y2=read();int c=read();
a[x1][y1]+=c,a[x1][y2+1]-=c,a[x2+1][y1]-=c,a[x2+1][y2+1]+=c;//读入+修改
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];//前缀和预处理
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cout<<s[i][j]<<" \n"[j==m];//每输出m个换行
return 0;
}