后面5个点T了
#include<bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
#define LL long long
#define lim 1000000
const LL MX=1*1000+10;
const LL ME=1000100;
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline void clear(queue<LL>& q) {
queue<LL> empty;
swap(empty, q);
}
LL T;
LL n,m;
struct tedge
{
LL to,next;
LL value;
}e[ME];
LL head[ME],cnt=0;
LL a[MX][MX],b[MX][MX];
LL num[MX*3];
bool used[MX*3];
LL dis[MX*3];
queue<LL> qaq;
inline void add(LL a,LL b,LL c)
{
e[++cnt].to=b,e[cnt].value=c;
e[cnt].next=head[a];
head[a]=cnt;
}
inline void limit(LL a,LL b,LL c)
{
//0<=c+a-b<=1000000
add(a,b,c),add(b,a,lim-c);
}
inline LL spfa()
{
dis[1]=0,used[1]=1;
qaq.push(1);
while(!qaq.empty())
{
LL q=qaq.front();
qaq.pop();
num[q]++;
if(num[q]>n+m) return 0;
for(LL i=head[q];i;i=e[i].next)
{
LL yt=e[i].to,val=e[i].value;
if(dis[yt]>dis[q]+val)
{
dis[yt]=dis[q]+val;
if(!used[yt])
{
used[yt]=1;
qaq.push(yt);
}
}
}
used[q]=0;
} //printf("OK\n");
return 1;
}
inline LL calc(LL x,LL y)
{
return a[x][y]+(((x+y)&1)?(dis[n+y]-dis[x]):(dis[x]-dis[n+y]));
}
inline void csh()
{
clear(qaq);
memset(head,0,sizeof(head));
cnt=0;
memset(e,0,sizeof(e));
for(LL i=1;i<=n+m;i++)
{
dis[i]=inf,num[i]=0,used[i]=0;
}
}
int main(int argc, char const *argv[])
{
freopen("mir.in","r",stdin);
freopen("mir.out","w",stdout);
T=read();
while(T--)
{
n=read(),m=read();
csh();
for(LL i=1;i<n;i++)
{
for(LL j=1;j<m;j++)
{
b[i][j]=read();
}
}
for(LL i=2;i<=n;i++)
{
for(LL j=2;j<=m;j++)
{
a[i][j]=b[i-1][j-1]-a[i-1][j-1]-a[i-1][j]-a[i][j-1];
}
}
for(LL i=1;i<=n;i++)
{
for(LL j=1;j<=m;j++)
{
if((i+j)%2==1) limit(n+j,i,a[i][j]);
else limit(i,n+j,a[i][j]);
}
}
if(!spfa())
{
printf("NO\n");
}
//printf("ok\n");
else
{
printf("YES\n");
//for(LL i=1;i<=n+m;i++) printf("%d ",dis[i]);
//printf("\n");
for(LL i=1;i<=n;i++)
{
for(LL j=1;j<=m;j++)
{
printf("%d ",calc(i,j));
a[i][j]=0;
}
printf("\n");
}
}
}
return 0;
}