Cod sursa(job #76440)

Utilizator flionIonescu Ionut Florin flion Data 9 august 2007 21:35:41
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>

#define nmax 505
#define logmax 11

int M[nmax][nmax][logmax];

int N, T, m, i, j, k, l, p, ras;

int maxim(int i, int j, int l1, int l2)
{
	int p, k, s, m;

	if (l1 == 0 || l2 == 0 || i > N || j > N) return 0;

	if (l1 == 1 && l2 == 1) return M[i][j][0];

	for (p = 0, k = 1; k <= l1 && k <= l2; p++, k <<= 1);
	k >>= 1; p--;

	s = M[i][j][p];

	m = maxim(i+k, j, l1-k, k);
	if (m > s) s = m;

	m = maxim(i, j+k, k, l2-k);
	if (m > s) s = m;

	m = maxim(i+k, j+k, l1-k, l2-k);
	if (m > s) s = m;

	return s;
}

int main(void)
{
	freopen("plantatie.in", "r", stdin);
	freopen("plantatie.out", "w", stdout);

	scanf("%d%d", &N, &T);

	// O(n*n)
	for (i = 1; i <= N; i++)
	  for (j = 1; j <= N; j++)
	    scanf("%d", &M[i][j][0]);

	// O(n*n*logn)
	for (k = 2, l = 1, p = 1; k <= N; p++, k <<= 1, l <<= 1)
	  for (i = 1; i <= N-k+1; i++)
	    for (j = 1; j <= N-k+1; j++)
	    {
	      M[i][j][p] = M[i][j][p-1];

	      if (M[i+l][j][p-1] > M[i][j][p])
		M[i][j][p] = M[i+l][j][p-1];

	      if (M[i][j+l][p-1] > M[i][j][p])
		M[i][j][p] = M[i][j+l][p-1];

	      if (M[i+l][j+l][p-1] > M[i][j][p])
		M[i][j][p] = M[i+l][j+l][p-1];
	    }

	for (m = 1; m <= T; m++)
	{
	  scanf("%d%d%d", &i, &j, &l);

	  for (p = 0, k = 1; k <= l; k<<=1, p++);
	  p--; k>>=1;

	  ras = M[i][j][p];

	  if (M[i+l-k][j][p] > ras)
	    ras = M[i+l-k][j][p];

	  if (M[i][j+l-k][p] > ras)
	    ras = M[i][j+l-k][p];

	  if (M[i+l-k][j+l-k][p] > ras)
	    ras = M[i+l-k][j+l-k][p];

	  printf("%d\n", ras);
	}

	return 0;
}