rt
#include<cstdio>
#include<algorithm>
#include<queue>
#define int long long
using namespace std;
inline int read()
{
int x=0,w=1;
char ch=0;
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*w;
}
inline void write(int x)
{
if(x<0)
{
x=-x;
putchar('-');
}
if(x>=10) write(x/10);
putchar((x%10)^48);
}
int n,m,k,t1[1005][1005],t2[1005][1005];
deque<pair<int,int>> q1,q2;
void insert1(pair<int,int> p)
{
while(!q1.empty()&&p.second-q1.front().second>=k) q1.pop_front();
while(!q1.empty()&&q1.front().first<=p.first) q1.pop_front();
q1.push_back(p);
}
void insert2(pair<int,int> p)
{
while(!q2.empty()&&p.second-q2.front().second>=k) q2.pop_front();
while(!q2.empty()&&q2.front().first>=p.first) q2.pop_front();
q2.push_back(p);
}
signed main()
{
int ans=0x7fffffff;
n=read();
m=read();
k=read();
for(int i=1;i<=n;i++)
{
q1.clear();
q2.clear();
for(int j=1;j<=m;j++)
{
int x=read();
insert1({x,j});
insert2({x,j});
if(j>=k)
{
t1[i][j]=q1.front().first;
t2[i][j]=q2.front().first;
}
}
}
for(int j=k;j<=m;j++)
{
q1.clear();
q2.clear();
for(int i=1;i<=n;i++)
{
insert1({t1[i][j],i});
insert2({t2[i][j],i});
if(i>=k) ans=min(ans,q1.front().first-q2.front().first);
}
}
write(ans);
return 0;
}