#include<bits/stdc++.h>
using namespace std;
int a,b,n;
int mig[1001][1001],M[1001][1001],m[1001][1001],que[1001],size=0,head=1,tail=0;
int Y[1001][1001],y[1001][1001];
void solve_max(){
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
while(size!=0 && que[tail]<mig[i][j]){
que[head]=0;
head++;
size--;
}
que[++tail]=mig[i][j];
size++;
if(j>=n){
while(size>n){
que[head]=0;
head++;
size--;
}
M[i][j-n+1]=que[head];
}
}
memset(que,0,sizeof(que));
size=0;head=1;tail=0;
}
for(int i=1;i<=b-n+1;i++){
for(int j=1;j<=a;j++){
while(size!=0 && que[tail]<M[j][i]){
que[head]=0;
head++;
size--;
}
que[++tail]=M[j][i];
size++;
if(j>=n){
while(size>n){
que[head]=0;
head++;
size--;
}
Y[j-n+1][i]=que[head];
}
}
memset(que,0,sizeof(que));
size=0;head=1;tail=0;
}
}
void solve_min(){
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
while(size!=0 && que[tail]>mig[i][j]){
que[head]=0;
head++;
size--;
}
que[++tail]=mig[i][j];
size++;
if(j>=n){
while(size>n){
que[head]=0;
head++;
size--;
}
m[i][j-n+1]=que[head];
}
}
memset(que,0,sizeof(que));
size=0;head=1;tail=0;
}
for(int i=1;i<=b-n+1;i++){
for(int j=1;j<=a;j++){
while(size!=0 && que[tail]>m[j][i]){
que[head]=0;
head++;
size--;
}
que[++tail]=m[j][i];
size++;
if(j>=n){
while(size>n){
que[head]=0;
head++;
size--;
}
y[j-n+1][i]=que[head];
}
}
memset(que,0,sizeof(que));
size=0;head=1;tail=0;
}
}
int main(){
cin>>a>>b>>n;
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
cin>>mig[i][j];
}
}
solve_max();
solve_min();
int mmmin=2147483647;
for(int i=1;i<=a-n+1;i++){
for(int j=1;j<=b-n+1;j++){
mmmin=min(mmmin,Y[i][j]-y[i][j]);
}
}
cout<<mmmin;
return 0;
}