Cod sursa(job #1042739)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 27 noiembrie 2013 17:25:15
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<stdio.h>
#define xa (1<<(k-1))
int m,n,i,j,k,q,p,pow[513];
struct ciorba
{
	int p[13];
}v[5013][513];
inline int max(int a, int b, int c, int d)
{
	return (a>b?a:b)>(c>d?c:d) ? (a>b?a:b) : (c>d?c:d) ;
}
int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=0;i<n;++i)
		for(j=0;j<n;++j)
			scanf("%d",&v[i][j].p[0]);
	for(k=1;1<<k<=n;++k)
		for(i=0;i<n;++i)
			for(j=0;j<n;++j)
				v[i][j].p[k]=max( v[i][j].p[k-1] , v[i+xa][j].p[k-1] , v[i][j+xa].p[k-1] , v[i+xa][j+xa].p[k-1] );
	for(k=0;(1<<k)<500;++k)pow[1<<k]=k;
	k=0;
	for(i=0;i<=501;++i)
		if(pow[i]==0)pow[i]=k;
	else k=pow[i];
	for(q=0;q<m;++q)
	{
		scanf("%d%d%d",&i,&j,&k);
		--i;--j;
		p=pow[k];
		k-=(1<<p);
		printf("%d\n",max( v[i][j].p[p] , v[i+k][j].p[p] , v[i][j+k].p[p] , v[i+k][j+k].p[p] ));
	}
	return 0;
}