Cod sursa(job #634972)

Utilizator sebii_cSebastian Claici sebii_c Data 18 noiembrie 2011 01:46:32
Problema Plantatie Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#define NMAX  503
#define LgMax 10

int A[NMAX][NMAX];
int lg[LgMax];
int RMQ[LgMax][NMAX][NMAX];

inline int max(int a, int b)
{
	return (a>b)?a:b;
}

int main()
{
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);
	int i, j, k, n, m, x, y;
	scanf("%d %d", &n, &m);
	for (i=1; i<=n; ++i)
		for (j=1; j<=n; ++j)
			scanf("%d", &A[i][j]);
	
	lg[1] = 0;
	for (i=2; i<=n; ++i)
		lg[i] = lg[i/2] + 1;

	for (i=1; i<=n; ++i)
		for (j=1; j<=n; ++j)
			RMQ[0][i][j] = A[i][j];

	for (j=1; (1<<j) <= n; ++j)
		for (i=1; i + (1<<j) - 1 <= n; ++i)
			for (k=1; k + (1<<j) - 1 <= n; ++k) {
				RMQ[j][i][k] = max(RMQ[j-1][i][k], max(RMQ[j-1][i + (1<<(j-1))][k],
											max(RMQ[j-1][i][k + (1<<(j-1))], 
											RMQ[j-1][i + (1<<(j-1))][k + (1<<(j-1))])));
			}

	for (i=1; i<=m; ++i) {
		scanf("%d %d %d", &x, &y, &k);
		int y1 = k + y;
		int x1 = k + x;
		int res = max(RMQ[lg[k]][x][y], max(RMQ[lg[k]][x1 - (1<<lg[k])][x], 
							max(RMQ[lg[k]][x][y1 - (1<<lg[k])], RMQ[lg[k]][x1 - (1<<lg[k])][y1 - (1<<lg[k])])));
		printf("%d\n", res);
	}
	return 0;
}