Cod sursa(job #236547)

Utilizator ilincaSorescu Ilinca ilinca Data 27 decembrie 2008 22:24:26
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>

#define nmax 505


int n, m, x, y, d;
int p [nmax], w [10] [nmax] [nmax];//v [i] [j] [k]=elementul maxim din patratul cu coltul stanga-sus in (j, k) si de latura 2^i


void puteri ()
{
	int w, i;
	for (w=1; (1 << w) <= nmax; ++w)
		for (i=(1 << w); i < (1 << (w+1)); ++i)
			p [i]=w;
}

void scan ()
{
	int i, j;
	scanf ("%d%d", &n, &m);
	for (i=1; i <= n; ++i)
		for (j=1; j <= n; ++j)
			scanf ("%d", &w [0] [i] [j]);
}

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

void preg ()
{
	int i, j, k, u, q;
	for (i=1; i <= p [n]; ++i)
	{
		q=1 << (i-1);
		u=n-(1 << i)+1;
		for (j=1; j <= u; ++j)
			for (k=1; k <= u; ++k)
				w [i] [j] [k]=max (w [i-1] [j] [k], max (w [i-1] [j] [k+q], max (w [i-1] [j+q] [k], w [i-1] [j+q] [k+q])));
	}
}

int main ()
{
	freopen ("plantatie.in", "r", stdin);
	freopen ("plantatie.out", "w", stdout);
	puteri ();
	scan ();
	preg ();
	int t;
	for (int i=1; i <= m; ++i)
	{
		scanf ("%d%d%d", &x, &y, &d);
		t=d-(1 << p [d]);
		printf ("%d\n", max (w [p [d]] [x] [y], max (w [p [d]] [x] [y+t], max (w [p [d]] [x+t] [y], w [p [d]] [x+t] [y+t]))));
	}
	return 0;
}