Cod sursa(job #247739)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 23 ianuarie 2009 21:39:50
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <cstdio>
#define lm 510

long a[10][lm][lm],lg[lm],n,m,x,y,l,k;

long max(long a, long b, long c, long d)
{
	if (a<b) a=b;
	if (a<c) a=c;
	if (a<d) a=d;
	return a;
}

int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	long i,j;
	for (i=1; i<=n; i++)
	    for (j=1; j<=n; j++) scanf("%ld ",&a[0][i][j]);
	for (i=2; i<=n; lg[i]=lg[i++/2]+1);
	for (k=1; k<=lg[n]; k++)
		for (i=1; i+(1<<k)-1<=n; i++)
		    for (j=1; j+(1<<k)-1<=n; j++)
			{
				l=1<<(k-1);
				a[k][i][j]=max(a[k-1][i][j], a[k-1][i][j+l], a[k-1][i+l][j], a[k-1][i+l][j+l]);
            }
	for (i=1; i<=m; i++)
	{
	    scanf("%ld %ld %ld",&x,&y,&l);
		k=lg[l];
		printf("%ld\n",max(a[k][x][y], a[k][x][y+l-(1<<k)],
		    a[k][x+l-(1<<k)][y], a[k][x+l-(1<<k)][y+l-(1<<k)]));
    }
	fclose(stdin);
	fclose(stdout);
}