Pagini recente » Cod sursa (job #70354) | Cod sursa (job #2611343) | Cod sursa (job #2323021) | Cod sursa (job #74199) | Cod sursa (job #67018)
Cod sursa(job #67018)
#include <stdio.h>
#define NMAX 502
int a[NMAX][NMAX][12];
int n, m;
void read()
{
int i, j;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
scanf("%d", &a[i][j][0]);
}
void solve()
{
int i, j, k, aux;
for(k = 1; k <= 10; ++k)
for(i = 1, aux = (1<<(k-1)); i <= n; ++i)
for(j = 1; j <= n; ++j)
{
a[i][j][k] = a[i][j][k-1];
if(i + aux <= n && a[i][j][k] < a[i + aux][j][k-1])
a[i][j][k] = a[i + aux][j][k-1];
if(j + aux <= n && a[i][j][k] < a[i][j + aux][k-1])
a[i][j][k] = a[i][j + aux][k-1];
if(j + aux <= n && i + aux <= n && a[i][j][k] < a[i + aux][j + aux][k-1])
a[i][j][k] = a[i + aux][j + aux][k-1];
}
}
void query()
{
int max, i, x, y, z, p, p2;
int pow[NMAX], pow2[NMAX];
for(pow[0] = pow[1] = 1, pow2[1] = pow2[0] = 0, i = 2; i < NMAX; ++i)
if(pow[i-1]*2 <= i)
pow[i] = pow[i-1]*2, pow2[i] = 1+pow2[i-1];
else
pow[i] = pow[i-1], pow2[i] = pow2[i-1];
for(i = 0; i < m; ++i)
{
scanf("%d %d %d", &x, &y, &z);
p2 = pow[z];
p = pow2[z];
max = a[x][y][p];
if(x+z-p2 > 0 && x+z-p2 <= n && a[x+z-p2][y][p] > max)
max = a[x+z-p2][y][p];
if(y+z-p2 > 0 && y+z-p2 <= n && a[x][y+z-p2][p] > max)
max = a[x][y+z-p2][p];
if(x+z-p2 > 0 && x+z-p2 <= n && y+z-p2 > 0 && y+z-p2 <= n && a[x+z-p2][y+z-p2][p] > max)
max = a[x+z-p2][y+z-p2][p];
printf("%d\n", max);
}
}
void print()
{
int i, j, k;
for(k = 0; k <= 5; ++k)
{
printf("pentru k = %d\n", k);
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= n; ++j)
printf("%d ", a[i][j][k]);
printf("\n");
}
printf("\n");
}
}
int main()
{
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
read();
solve();
//print();
query();
fclose(stdin);
fclose(stdout);
return 0;
}