Cod sursa(job #152352)

Utilizator savimSerban Andrei Stan savim Data 9 martie 2008 13:19:20
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
int i,j,k,p,q,r,n,m;
int a[501][501];
int c[501][501][10];
int main()
{
	freopen("plant.in","r",stdin);
	freopen("plant.out","w",stdout);

    scanf("%d %d",&n,&m);
    for (i=1; i<=n; i++)
        for (j=1; j<=n; j++)
        {
            scanf("%d",&a[i][j]);
            c[i][j][0]=a[i][j];
        }
    for (p=0; p<=n; p++)
        if ((1<<(p+1))>n) break;
        
	for (k=1; k<=p; k++)
		for (i=1; i<=n; i++)
			for (j=1; j<=n; j++)
			if (j+(1<<k)-1<=n && i+(1<<k)-1<=n)
			{
                int max=c[i][j][k-1];
				if (c[i+(1<<(k-1))][j][k-1]>max) max=c[i+(1<<(k-1))][j][k-1];
				if (c[i][j+(1<<(k-1))][k-1]>max) max=c[i][j+(1<<(k-1))][k-1];
				if (c[i+(1<<(k-1))][j+(1<<(k-1))][k-1]>max) max=c[i+(1<<(k-1))][j+(1<<(k-1))][k-1];

				if (max>c[i][j][k]) c[i][j][k]=max;
			}

	for (i=1; i<=m; i++)
    {
		scanf("%d %d %d",&p,&q,&r);
        for (j=0; j<=r; j++)
			if ((1<<(j+1))>=r) break;

		int max=c[p][q][j];
		if (c[p][q+r-(1<<j)][j]>max) max=c[p][q+r-(1<<j)][j];
		if (c[p+r-(1<<j)][q][j]>max) max=c[p+r-(1<<j)][q][j];
		if (c[p+r-(1<<j)][q+r-(1<<j)][j]>max) max=c[p+r-(1<<j)][q+r-(1<<j)][j];

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

	return 0;
}