Cod sursa(job #579407)

Utilizator SadmannCornigeanu Calin Sadmann Data 12 aprilie 2011 09:25:20
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<cstdio>
using namespace std;

int V[501][501][10],lg[1000],i,j,k,n,m,I,J,L,LG,MAX(int a,int b,int c,int d);

void read(),solve();

int main()
{
	read();
	solve();
	return 0;
}


void read()
{
	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",&V[i][j][0]);
	lg[1]=0;
	for(i=2;i<=n;i++)
		lg[i]=lg[i>>2]+1;
}

void solve()
{
	for(k=1;(1<<k)<=n;k++)
	{
		for(i=1;i+(1<<k)-1<=n;i++)
		{
			for(j=1;j+(1<<k)-1<=n;j++)
			{
				L=(1<<(k-1));
				V[i][j][k]=MAX(V[i][j][k-1],V[i][j+L][k-1],V[i+L][j][k-1],V[i+L][j+L][k-1]);
			}
		}
	}
	for(;m;m--)
	{
		scanf("%d%d%d",&i,&j,&k);
		LG=lg[k];
		L=(1<<LG);
		I=i+k;J=j+k;
		printf("%d\n",MAX(V[i][j][LG],V[I-L][j][LG],V[i][J-L][LG],V[I-L][J-L][LG]) );
	}
}
int MAX(int a,int b,int c,int d)
{
	int rez=0;
	if(rez<a)rez=a;
	if(rez<b)rez=b;
	if(rez<c)rez=c;
	if(rez<d)rez=d;
	return rez;
}