Pagini recente » Cod sursa (job #321864) | Cod sursa (job #1359814) | Cod sursa (job #1353312) | Cod sursa (job #1538895) | Cod sursa (job #633614)
Cod sursa(job #633614)
#include <cstdio>
#define MAXN 501
int N, M;
int a[10][MAXN][MAXN];
FILE *f, *g;
void read();
void precomp();
int query(int i, int j, int k);
int main()
{
read();
precomp();
for (int i = 1 ; i <= M ; ++i)
{
int i, j, k;
fscanf(f, "%d %d %d", &i, &j, &k);
fprintf(g, "%d\n", query(i, j, k));
}
return 0;
}
void read()
{
f = fopen("plantatie.in", "r");
g = fopen("planataie.out", "w");
fscanf(f, "%d %d", &N, &M);
for (int i = 1; i <= N ; ++i)
for (int j = 1 ; j <= N ; ++j)
fscanf(f, "%d", &a[0][i][j]);
}
void precomp()
{
for (int k = 1 ; (1 << k) <= N ; ++k)
for (int i = 1 ; i <= N - (1 << k) + 1 ; ++i)
for (int j = 1 ; j <= N - (1 << k) + 1; ++j)
{
a[k][i][j] = a[k - 1][i][j];
if (a[k][i][j] < a[k - 1][i + (1 << (k - 1))][j])
a[k][i][j] = a[k - 1][i + (1 << (k - 1))][j];
if (a[k][i][j] < a[k - 1][i][j + (1 << (k - 1))])
a[k][i][j] = a[k - 1][i][j + (1 << (k - 1))];
if (a[k][i][j] < a[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))])
a[k][i][j] = a[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))];
}
}
int query(int i, int j, int k)
{
int p = 10, result;
while ((1 << p) > k) p--;
result = a[p][i][j];
if (result < a[p][i + k - (1 << p)][j])
result = a[p][i + k - (1 << p)][j];
if (result < a[p][i][j + k - (1 << p)])
result = a[p][i][j + k - (1 << p)];
if (result < a[p][i + k - (1 << p)][j + k - (1 << p)])
result = a[p][i + k - (1 << p)][j + k - (1 << p)];
return result;
}