二维前缀和
/*注意:为了方便处理边界 s[0]=0;*/
//s[i][j]表示从(0,0)到(i,j)一小块的和
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
二维差分
const int N=10010;
int n,m,q;
int a[N][N],b[N][N];
void insert(int x1,int y1,int x2,int y2,int k)
{
b[x1][y1]=b[x1][y1]+k;
b[x2+1][y1]=b[x2+1][y1]-k;
b[x1][y2+1]=b[x1][y2+1]-k;
b[x2+1][y2+1]=b[x2+1][y2+1]+k;
}
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
//对差分矩阵进行n*m次插入,相当于初始化差分矩阵
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
insert(i,j,i,j,a[i][j]);
}
}
}