#include #include using namespace std; #define inf 1073741823 #define N 105 #define M 5005 int t[N][M]; int f[N][M]; int dp[N][M]; int summ[M<<2],add[M<<2]; inline int min(int a,int b) { return a>1; build(l,mid,idx<<1); build(mid+1,r,idx<<1|1); } void update(int a,int b,int w,int l,int r,int idx) { if(a<=l&&r<=b) { add[idx]=min(w,add[idx]); summ[idx]=min(add[idx],summ[idx]); return; } int mid=(l+r)>>1; push_down(idx); if(a<=mid) update(a,b,w,l,mid,idx<<1); if(mid>1; push_down(idx); int res=inf; if(a<=mid) res=min(res,query(a,b,l,mid,idx<<1)); if(mid'9';); n=cc-'0'; for(;cc=getchar(),cc>='0'&&cc<='9';) n=n*10+cc-'0'; } int main() { int n,m; for(;scanf("%d%d",&n,&m)&&(n!=0||m!=0);) { for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scan(t[i][j]); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scan(f[i][j]); for(int i=1;i<=m;++i) dp[1][i]=t[1][i]; for(int i=2;i<=n;++i) { build(1,m,1); for(int j=1;j<=m;++j) update(j-f[i-1][j],j+f[i-1][j],dp[i-1][j],1,m,1); for(int j=1;j<=m;++j) dp[i][j]=query(j-f[i][j],j+f[i][j],1,m,1)+t[i][j]; } int ans=inf; for(int i=1;i<=m;++i) ans=min(ans,dp[n][i]); printf("%d\n",ans); } return 0; }