Pagini recente » Cod sursa (job #1070298) | Cod sursa (job #892277) | Cod sursa (job #2119863) | Cod sursa (job #1909426) | Cod sursa (job #754866)
Cod sursa(job #754866)
#include <stdio.h>
#define NMAX (1 << 9)
int x[NMAX][NMAX], RM[10][NMAX][NMAX];
inline int max(int A, int B)
{
return A > B ? A : B;
}
void PreprocessRMQ2D(int N)
{
int i, j, k;
for (i = 1; i <= N; i ++)
for (j = 1; j <= N; j ++)
RM[0][i][j] = x[i][j];
for (k = 1; (1 << k) <= N; k ++)
for (i = 1; i <= N; i ++)
for (j = 1; j <= N; j ++)
{
if (i + (1 << k) - 1 > N || j + (1 << k) - 1 > N)
break;
RM[k][i][j] = RM[k - 1][i][j];
RM[k][i][j] = max(RM[k][i][j], RM[k - 1][i + (1 << (k - 1))][j]);
RM[k][i][j] = max(RM[k][i][j], RM[k - 1][i][j + (1 << (k - 1))]);
RM[k][i][j] = max(RM[k][i][j], RM[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]);
}
}
int Lg[NMAX];
void PreprocessLog(int N)
{
int i;
Lg[1] = 0;
for (i = 2; i <= N; i ++)
Lg[i] = Lg[i / 2] + 1;
}
int Query(int x0, int y0, int K)
{
int le = Lg[K], sol;
sol = RM[le][x0][y0];
sol = max(sol, RM[le][x0 + K - (1 << le)][y0]);
sol = max(sol, RM[le][x0][y0 + K - (1 << le)]);
sol = max(sol, RM[le][x0 + K - (1 << le)][y0 + K - (1 << le)]);
return sol;
}
int main()
{
int i, j, N, K, M, x0, y0;
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i = 1; i <= N; i ++)
for (j = 1; j <= N; j ++)
scanf("%d", &x[i][j]);
PreprocessLog(N);
PreprocessRMQ2D(N);
for (i = 1; i <= M; i ++)
{
scanf("%d%d%d", &x0, &y0, &K);
printf("%d\n", Query(x0, y0, K));
}
return 0;
}