#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
const int INF = 0x3f3f3f3f, N = 1e3 + 5;
int n, m, k, ans = INF;
int g[N][N];
int rmax[N][N], rmin[N][N], cmax[N][N], cmin[N][N]; // row行与col列统计的最值
deque<int> q, p; //用于求最大值和最小值的单调队列
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> m >> k;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m ; j ++)
cin >> g[i][j];
// 对每一行每一个长度为k的区间求出最大值和最小值
for(int j = 1; j <= n; j ++)
{
q.clear(), p.clear();
for(int i = 1; i <= m; i ++)
{
while(q.size() && i - q.front() >= k) q.pop_front();
while(p.size() && i - p.front() >= k) p.pop_front();
while(q.size() && g[j][i] > g[j][q.back()]) q.pop_back();
while(p.size() && g[j][i] < g[j][p.back()]) p.pop_back();
q.push_back(i);
p.push_back(i);
if(i >= k) {
rmax[j][i-k+1] = g[j][q.front()];
rmin[j][i-k+1] = g[j][p.front()];
}
}
}
m--;
// 在对处理后的每一列求最值
for(int j = 1; j <= m ; j ++)
{
q.clear(), p.clear();
for(int i = 1; i <= n; i ++)
{
while(q.size() && i - q.front() >= k) q.pop_front();
while(p.size() && i - p.front() >= k) p.pop_front();
while(q.size() && rmax[i][j] > rmax[q.front()][j]) q.pop_back();
while(p.size() && rmin[i][j] < rmin[p.front()][j]) p.pop_back();
q.push_back(i);
p.push_back(i);
if(i >= k) {
cmax[i-k+1][j] = rmax[q.front()][j];
cmin[i-k+1][j] = rmin[p.front()][j];
}
}
}
n--;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m ; j ++)
ans = min(ans, cmax[i][j]-cmin[i][j]);
cout << ans << endl;
return 0;
}