Pagini recente » Cod sursa (job #2095097) | Cod sursa (job #255426) | Cod sursa (job #2084882) | Cod sursa (job #582165) | Cod sursa (job #1438923)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#define NMAX 500
#define HMAX 9
using namespace std;
void print(int ***a, int n, int m);
int max(int a, int b) {
if (a > b) return a;
return b;
}
int main() {
int N, M, ***a;
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
scanf("%d%d", &N, &M);
a = (int ***)calloc(NMAX, sizeof(int **));
for (int i = 0; i < NMAX; i++) {
a[i] = (int **)calloc(NMAX, sizeof(int *));
for (int j = 0; j < NMAX; j++)
a[i][j] = (int *)calloc(HMAX, sizeof(int));
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
scanf("%d", &a[i][j][0]);
/* init */
//print(a, N, 0);
int msb = 1;
while ((1 << msb) <= N) ++msb;
for (int t = 1; t < msb; t++) {
int d = 1 << t;
int dp = d >> 1;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
/* level d */
a[i][j][t] = a[i][j][t - 1];
if (i + d <= N && j + d <= N) {
a[i][j][t] = max(a[i][j][t], a[i][j + (d >> 1)][t - 1]);
a[i][j][t] = max(a[i][j][t], a[i + (d >> 1)][j][t - 1]);
a[i][j][t] = max(a[i][j][t], a[i + (d >> 1)][j + (d >> 1)][t - 1]);
}
else if (i + d < N)
a[i][j][t] = max(a[i][j][t], a[i + (d >> 1)][j][t - 1]);
else if (j + d < N)
a[i][j][t] = max(a[i][j][t], a[i][j + (d >> 1)][t - 1]);
if (i + d >= N && j + d >= N) {
a[i][j][t] = max(a[i][j][t], a[i][N - 1][t - 1]);
a[i][j][t] = max(a[i][j][t], a[N - 1][j][t - 1]);
a[i][j][t] = max(a[i][j][t], a[N - 1][N - 1][t - 1]);
}
else if (i + d >= N)
a[i][j][t] = max(a[i][j][t], a[N - 1][j][t - 1]);
else if (j + d >= N)
a[i][j][t] = max(a[i][j][t], a[i][N - 1][t - 1]);
}
}
int x, y, k;
while (M--) {
scanf("%d %d %d", &x, &y, &k);
int m = a[x][y][0];
msb = 0;
while ((1 << msb) <= k) ++msb;
--msb;
if (x + (1 << msb) <= N && y + (1 << msb) <= N) {
m = max(m, a[x + (msb >> 1)][y][msb]);
m = max(m, a[x][y + (msb >> 1)][msb]);
m = max(m, a[x + (msb >> 1)][y + (msb >> 1)][msb]);
}
if (x + (1 << msb) > N && y + (1 << msb) > N) {
if (x + (1 << msb) > N)
m = max(m, a[N - 1][y][msb]);
if (y + (1 << msb) > N)
m = max(m, a[x][N - 1][msb]);
}
printf("%d\n", m);
}
for (int i = 0; i < NMAX; i++) {
for (int j = 0; j < NMAX; j++)
free(a[i][j]);
free(a[i]);
}
free(a);
return 0;
}
void print(int ***a, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%2d ", a[i][j][m]);
printf("\n");
}
}