Pagini recente » Cod sursa (job #3249099) | Cod sursa (job #36724) | Cod sursa (job #36392) | Cod sursa (job #2918785) | Cod sursa (job #16798)
Cod sursa(job #16798)
#include <stdio.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define MAX_N 512
#define MAX_LG 10
#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
int N, M, A[MAX_N][MAX_N], rmq[MAX_LG][MAX_N][MAX_N], lg[MAX_N];
int main(void)
{
int i, j, t, p, inc, ret;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d", &N, &M);
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", A[i]+j);
FOR (i, 1, N+1) FOR (j, 1, N+1) rmq[0][i][j] = A[i][j];
for (t = 0; (1<<t) <= N; t++)
{
inc = (1<<t);
FOR (i, 1, N+1) FOR (j, 1, N+1)
{
rmq[t+1][i][j] = rmq[t][i][j];
if (i+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i+inc][j]);
if (j+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i][j+inc]);
if (i+inc <= N && j+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i+inc][j+inc]);
}
}
for (i = 2, j = 1; i <= N; i++)
{
lg[i] = j;
if ((1<<(j+1)) == i+1) j++;
}
for (; M > 0; M--)
{
scanf("%d %d %d", &i, &j, &inc);
i--; j--;
t = lg[inc]; p = 1<<t;
ret = rmq[t][i][j];
if (j+inc >= p) ret = max(ret, rmq[t][i][j+inc-p]);
if (i+inc >= p) ret = max(ret, rmq[t][i+inc-p][j]);
if (i+inc >= p && j+inc >= p) ret = max(ret, rmq[t][i+inc-p][j+inc-p]);
printf("%d\n", ret);
}
return 0;
}