Cod sursa(job #19424)
#include <cstdio>
using namespace std;
const char iname[] = "plantatie.in";
const char oname[] = "plantatie.out";
#define MAX_N 505
#define MAX_LG 10
int A[MAX_N][MAX_N][MAX_LG];
int N, M;
int main(void)
{
freopen(iname, "r", stdin);
int i;
int j;
int k;
int r;
int P[MAX_N] = {0}, ret;
for (scanf("%d %d", & N, & M), i = 1; i <= N; ++ i)
for (j = 1; j <= N; ++ j)
scanf("%d", A[i][j]);
for (k = 1; k <= MAX_LG; ++ k) {
for (i = 1; i <= N; ++ i)
for (j = 1; j <= N; ++ j) {
int add = 1 << (k - 1);
if ((i + add > N) || (j + add > N))
continue ;
int ret = A[i][j][k - 1];
if (ret < A[i + add][j][k - 1])
ret = A[i + add][j][k - 1];
if (ret < A[i][j + add][k - 1])
ret = A[i][j + add][k - 1];
if (ret < A[i + add][j + add][k - 1])
ret = A[i + add][j + add][k - 1];
A[i][j][k] = ret;
}
}
for (i = 0; 1 << i <= N; ++ i)
P[1 << i] = i;
for (i = 3; i <= N; ++ i) {
if (P[i] == 0)
P[i] = P[i - 1];
}
freopen(oname, "w", stdout);
for (; M > 0; -- M) {
scanf("%d %d %d", & i, & j, & k);
r = P[k];
ret = A[i][j][r];
if (ret < A[i + k - (1 << r)][j][r])
ret = A[i + k - (1 << r)][j][r];
if (ret < A[i][j + k - (1 << r)][r])
ret = A[i][j + k - (1 << r)][r];
if (ret < A[i + k - (1 << r)][j + k - (1 << r)][r])
ret = A[i + k - (1 << r)][j + k - (1 << r)][r];
printf("%d\n", ret);
}
return 0;
}