int f[maxn][maxn][10][10];
inline int highbit(int x) { return 31 - __builtin_clz(x); }
inline int calc(int x, int y, int xx, int yy, int p, int q) {
return max(
max(f[x][y][p][q], f[xx - (1 << p) + 1][yy - (1 << q) + 1][p][q]),
max(f[xx - (1 << p) + 1][y][p][q], f[x][yy - (1 << q) + 1][p][q])
);
}
void init() {
FOR (x, 0, highbit(n) + 1)
FOR (y, 0, highbit(m) + 1)
FOR (i, 0, n - (1 << x) + 1)
FOR (j, 0, m - (1 << y) + 1) {
if (!x && !y) { f[i][j][x][y] = a[i][j]; continue; }
f[i][j][x][y] = calc(
i, j,
i + (1 << x) - 1, j + (1 << y) - 1,
max(x - 1, 0), max(y - 1, 0)
);
}
}
inline int get_max(int x, int y, int xx, int yy) {
return calc(x, y, xx, yy, highbit(xx - x + 1), highbit(yy - y + 1));
}