Cod sursa(job #305519)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 aprilie 2009 18:08:04
Problema Plantatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
int n,m,i,j,k,l,ll,
    b[512],c[512],a[10][512][512],
	query(),max4(int aa,int bb,int cc,int dd);
void readd(),solve();
int main()
{
	readd();
	solve();
	return 0;
}
void readd()
{
	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[0][i][j]);
}
void solve()
{
	for(l=2,k=1;l<n;l<<=1,k++)
	{
	 ll=l>>1;
	 for(i=1;i<=n-l+1;i++)
	 for(j=1;j<=n-l+1;j++)
	  a[k][i][j]=max4(a[k-1][i][j],a[k-1][i+ll][j],a[k-1][i][j+ll],a[k-1][i+ll][j+ll]);
	}
	for(i=1;i<=9;i++)c[(1<<i)+1]=1;
	for(i=3;i<=n;i++)c[i]+=c[i-1];
	for(i=2;i<=n;i++)b[i]=1<<c[i];
	for(;m;m--)
	{
		scanf("%d%d%d",&i,&j,&l);
		printf("%d\n",query());
	}
}
int query()
{
	int ii=i+l-b[l],jj=j+l-b[l],k=c[l];
	return max4(a[k][i][j],a[k][ii][j],a[k][i][jj],a[k][ii][jj]);
	
}			
	
int max4(int aa,int bb,int cc,int dd)
{
	aa=(aa>cc)?aa:cc;
	bb=(bb>dd)?bb:dd;
	return (aa>bb)?aa:bb;
}