rt,马蜂最近有点奇怪,但是挺短
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5,inf=1e9;
int inline read()
{
int num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int r,c,n,h,t,a[N][N],mx[N][N],mn[N][N],x[N],y[N],q[N],Ans=inf;
void calc(int siz)
{
h=1;t=0;
for(int i=1;i<=siz;i++)
{
while(h<=t&&x[q[t]]<=x[i])t--;q[++t]=i;
while(h<=t&&q[h]<=i-n)h++;y[i]=q[h];
}
}
void solve(int ans[N][N])
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)x[j]=a[i][j];
calc(c);
for(int j=1;j<=c;j++)ans[i][j]=a[i][y[j]];
}
for(int j=1;j<=c;j++)
{
for(int i=1;i<=r;i++)x[i]=ans[i][j];
calc(r);
for(int i=1;i<=r;i++)ans[i][j]=ans[y[i]][j];
}
}
int main(){
r=read();c=read();n=read();
for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)a[i][j]=read();solve(mx);
for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)a[i][j]=-a[i][j];solve(mn);
for(int i=n;i<=r;i++)for(int j=n;j<=c;j++)Ans=min(Ans,mx[i][j]+mn[i][j]);
printf("%d",Ans);
return 0;
}