#include <climits>
#include <iostream>
using namespace std;
const int N = 1010;
int a, b, n;
int W[N][N];
int RMX[N][N], RMN[N][N];
int C[N], CMX[N], CMN[N];
int Q[N], hh, tt;
void getMax(int tar[], int sou[], int len)
{
hh = 0, tt = -1;
for (int i = 1; i <= len; i++)
{
if (hh <= tt && Q[hh] <= i - n) hh++;
while (hh <= tt && sou[Q[tt]] <= sou[i]) tt--;
Q[++tt] = i;
tar[i] = sou[Q[hh]];
}
}
void getMin(int tar[], int sou[], int len)
{
hh = 0, tt = -1;
for (int i = 1; i <= len; i++)
{
if (hh <= tt && Q[hh] <= i - n) hh++;
while (hh <= tt && sou[Q[hh]] >= sou[i]) tt--;
Q[++tt] = i;
tar[i] = sou[Q[hh]];
}
}
int main()
{
scanf("%d%d%d", &a, &b, &n);
for (int i = 1; i <= a; i++)
for (int j = 1; j <= b; j++)
scanf("%d", &W[i][j]);
for (int i = 1; i <= a; i++)
{
getMax(RMX[i], W[i], b);
getMin(RMN[i], W[i], b);
}
int res = INT_MAX;
for (int j = n; j <= b; j++)
{
for (int i = 1; i <= a; i++) C[i] = RMX[i][j];
getMax(CMX, C, a);
for (int i = 1; i <= a; i++) C[i] = RMN[i][j];
getMin(CMN, C, a);
for (int i = n; i <= a; i++) res = min(res, CMX[i] - CMN[i]);
}
printf("%d\n", res);
return 0;
}