AC: #2 #3 #4 #5 #6 #7 #8 #9
TLE: #1 #10
#1 1.20ms
#10 1.09ms
#include <bits/stdc++.h>
#define ll long long
#define _for(i, a, b) for (int i = (a); i <= (b); i ++ )
#define _all(i, a, b) for (int i = (a); i >= (b); i -- )
using namespace std;
const int N = 1005;
int a, b, n, ans = 2e9, v[N][N], p_max[N][N][15], p_min[N][N][15];
// (x,y) (x+n-1,y) (x+n-1,y+n-1) (x,y+n-1)
inline int query_max(int x, int y) {
int k = int(log2(n * 1.0)), ret = -2e9;
_for (i, x, x + n - 1) ret = max(ret, max(p_max[i][y][k], p_max[i][y + n - 1 - (1 << k) + 1][k]));
return ret;
}
inline int query_min(int x, int y) {
int k = int(log2(n * 1.0)), ret = 2e9;
_for (i, x, x + n - 1) ret = min(ret, min(p_min[i][y][k], p_min[i][y + n - 1 - (1 << k) + 1][k]));
return ret;
}
int main() {
ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> a >> b >> n;
_for (i, 1, a) _for (j, 1, b) cin >> v[i][j], p_max[i][j][0] = p_min[i][j][0] = v[i][j];
_for (P, 1, a) for (int j = 1; (1 << j) <= b; j ++ ) _for (i, 1, b - (1 << (j - 1)))
p_max[P][i][j] = max(p_max[P][i][j - 1], p_max[P][i + (1 << (j - 1))][j - 1]),
p_min[P][i][j] = min(p_min[P][i][j - 1], p_min[P][i + (1 << (j - 1))][j - 1]);
_for (i, 1, a - n + 1) _for (j, 1, b - n + 1) ans = min(ans, query_max(i, j) - query_min(i, j));
cout << ans << endl;
return 0;
}