#include<bits/stdc++.h>
using namespace std;
long long g[1005][1005];
long long maxn[1005][1005],minn[1005][1005],maxm[1005][1005],minm[1005][1005],ans=10000000000000;
deque<long long> dq;
int main(){
int a,b,n; scanf("%d%d%d",&a,&b,&n);
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++) scanf("%lld",&g[i][j]);
int tmp1=0;
for(int i=1;i<=a;i++){
dq.push_back(1);
tmp1=0;
for(int j=2;j<=b;j++){
while(!dq.empty()&&g[i][dq.back()]<=g[i][j]) dq.pop_back();
while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
dq.push_back(j);
if(j>=n) maxn[i][++tmp1]=g[i][dq.front()];
}
while(!dq.empty()) dq.pop_front();
}
int tmp2=0;
for(int i=1;i<=tmp1;i++){
dq.push_back(1);
tmp2=0;
for(int j=2;j<=a;j++){
while(!dq.empty()&&maxn[dq.front()][i]<=maxn[j][i]) dq.pop_back();
while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
dq.push_back(j);
if(j>=n) maxm[++tmp2][i]=maxn[dq.front()][i];
}
while(!dq.empty()) dq.pop_front();
}
for(int i=1;i<=a;i++){
dq.push_back(1);
tmp1=0;
for(int j=2;j<=b;j++){
while(!dq.empty()&&g[i][dq.back()]>=g[i][j]) dq.pop_back();
while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
dq.push_back(j);
if(j>=n) minn[i][++tmp1]=g[i][dq.front()];
}
while(!dq.empty()) dq.pop_front();
}
for(int i=1;i<=tmp1;i++){
dq.push_back(1);
tmp2=0;
for(int j=2;j<=a;j++){
while(!dq.empty()&&minn[dq.front()][i]>=minn[j][i]) dq.pop_back();
while(!dq.empty()&&dq.front()+n<=j) dq.pop_front();
dq.push_back(j);
if(j>=n) minm[++tmp2][i]=minn[dq.front()][i];
}
while(!dq.empty()) dq.pop_front();
}
for(int i=1;i<=tmp2;i++)
for(int j=1;j<=tmp1;j++)
ans=min(ans,abs(maxm[i][j]-minm[i][j]));
printf("%lld",ans);
return 0;
}