Cod sursa(job #152019)

Utilizator savimSerban Andrei Stan savim Data 8 martie 2008 22:34:36
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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("plantatie.in","r",stdin);
	freopen("plantatie.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+j][q][j]>max) max=c[p+j][q][j];
		if (c[p][q+j][j]>max) max=c[p][q+j][j];
		if (c[p+j][q+j][j]>max) max=c[p+j][q+j][j];
        printf("%d\n",max);
    }

	return 0;
}