Cod sursa(job #1438923)

Utilizator andreirulzzzUPB-Hulea-Ionescu-Roman andreirulzzz Data 21 mai 2015 05:30:05
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#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");
	}
}