60pts
#include<bits/stdc++.h>
#define ll int
using namespace std;
const int N = (1e3 + 20);
ll n, m, k;
ll log_2[N];
ll st1[N][N][20];
ll st2[N][N][20];
int main(){
memset(st2, 125, sizeof(st2));
ll minn = st2[0][0][0];
ll INF = minn;
scanf("%d%d%d", &n, &m, &k);
log_2[1] = 0, log_2[2] = 1;
for(ll i = 3; i <= k; i++) log_2[i] = log_2[i/2] + 1;
for(ll i = 1; i <= n; i++) {
for(ll j = 1; j <= m; j++) {
scanf("%d", &st1[i][j][0]);
st2[i][j][0] = st1[i][j][0];
}
}
for(ll len = 1; len <= 11; len++) {
for(ll i = 1; i + (1 << (len)) - 1 <= n; i++) {
for(ll j = 1; j + (1 << (len)) - 1 <= m; j++) {
ll D = (1 << (len - 1));
ll K = len - 1;
st1[i][j][len] = max(max(st1[i][j][K], st1[i + D][j + D][K]), max(st1[i][j + D][K], st1[i + D][j][K]));
st2[i][j][len] = min(min(st2[i][j][K], st2[i + D][j + D][K]), min(st2[i][j + D][K], st2[i + D][j][K]));
}
}
}
for(ll i = 1; i + (k - 1) <= n; i++) {
for(ll j = 1; j + (k - 1) <= m; j++) {
ll x = i + k, y = j + k;
ll K = log_2[k];
ll D = (1 << K);
if(x - D < 0 || y - D < 0) continue;
ll Maxx = max(max(st1[i][j][K], st1[x - D][y - D][K]), max(st1[i][y - D][K], st1[x - D][j][K]));
ll Minn = min(min(st2[i][j][K], st2[x - D][y - D][K]), min(st2[i][y - D][K], st2[x - D][j][K]));
if(Minn == INF) continue;
ll ans = Maxx - Minn;
minn = min(minn, ans);
}
}
cout << minn;
return 0;
}