Pagini recente » Cod sursa (job #601049) | Cod sursa (job #2185048) | Cod sursa (job #2899424) | Cod sursa (job #2949488) | Cod sursa (job #21446)
Cod sursa(job #21446)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MMAX 9
#define NMAX 512
#define MIN(x,y) ( (x) < (y) ? (x) : (y) )
#define MAX(x,y) ( (x) > (y) ? (x) : (y) )
int MaxR[NMAX][NMAX][MMAX];
int N, K, x, y, z, put[NMAX], i, j, k, logn;
void read()
{
freopen("plantatie.in", "r", stdin);
scanf("%d %d", &N, &K);
for(i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
scanf("%d", &MaxR[i][j][0]);
}
void precalc()
{
int q;
for (q = 0, i = 1; i <= N; i++)
if ( i > (1 << q) && i >= ( 1 << (q+1) ) )
put[i] = q + 1, q++; else put[i] = q;
}
void RMQ()
{
logn = put[N];
for (k = 1; k <= logn; k++)
for (i = 1; i <= (N - (1<<k) + 1); i++)
for (j = 1; j <= (N - (1<<k) + 1); j++)
{
int mx1 = MAX(MaxR[i][j][k-1], MaxR[i + (1<<(k-1))][j + (1<<(k-1))][k-1]);
int mx2 = MAX(MaxR[i + (1<<(k-1))][j][k-1], MaxR[i][j + (1<<(k-1))][k-1]);
MaxR[i][j][k] = MAX(mx1, mx2);
}
}
int query(int x, int y, int z)
{
int t;
t = put[z];
int mx1 = MAX(MaxR[x][y][t], MaxR[x + z - (1<<t)][y + z - (1<<t)][t]);
int mx2 = MAX(MaxR[x][y + z - (1<<t)][t], MaxR[x + z - (1<<t)][y][t]);
return MAX(mx1, mx2);
}
void solve()
{
freopen("plantatie.out", "w", stdout);
while (K--)
{
scanf("%d %d %d", &x, &y, &z);
printf("%d\n", query(x, y, z));
}
}
int main()
{
read();
precalc();
RMQ();
solve();
return 0;
}