#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int m[MAXN][MAXN];
int mxi[MAXN][MAXN], mni[MAXN][MAXN], mxj[MAXN][MAXN], mnj[MAXN][MAXN];
deque<int> q;
int main() {
int a, b, n, ans = (int)2e9;
scanf("%d%d%d", &a, &b, &n);
for (int i = 1; i <= a; i++)
for (int j = 1; j <= b; j++)
scanf("%d", &m[i][j]);
for (int i = 1; i <= a; i++) {
q.clear();
for (int j = 1; j <= b; j++) {
while (!q.empty() && q.front() + n <= j)
q.pop_front();
while (!q.empty() && m[i][q.back()] <= m[i][j])
q.pop_back();
q.push_back(j);
if (j >= n)
mxi[i][j - n + 1] = m[i][q.front()];
}
q.clear();
for (int j = 1; j <= b; j++) {
while (!q.empty() && q.front() + n <= j)
q.pop_front();
while (!q.empty() && m[i][q.back()] >= m[i][j])
q.pop_back();
q.push_back(j);
if (j >= n)
mni[i][j - n + 1] = m[i][q.front()];
}
}
for (int j = 1; j <= b - n + 1; j++) {
q.clear();
for (int i = 1; i <= a; i++) {
while (!q.empty() && q.front() + n <= i)
q.pop_front();
while (!q.empty() && mxi[q.back()][j] <= mxi[i][j])
q.pop_back();
q.push_back(i);
if (i >= n)
mxj[i - n + 1][j] = m[q.front()][j];
}
q.clear();
for (int i = 1; i <= a; i++) {
while (!q.empty() && q.front() + n <= i)
q.pop_front();
while (!q.empty() && mni[q.back()][j] >= mni[i][j])
q.pop_back();
q.push_back(i);
if (i >= n)
mnj[i - n + 1][j] = m[q.front()][j];
}
}
for (int i = 1; i <= a - n + 1; i++)
for (int j = 1; j <= b - n + 1; j++)
ans = min(ans, mxj[i][j] - mnj[i][j]);
printf("%d\n", ans);
return 0;
}