Cod sursa(job #351279)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 27 septembrie 2009 14:31:17
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#define N 1<<9
int n,m;
int mat[N][N],rmq[10][N][N],log[N];
void read()
{
	scanf("%d%d",&n,&m);
	int i,j;
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
			scanf("%d",&mat[i][j]), rmq[0][i][j]=mat[i][j];
	for (i=2; i<=n; i++)
		log[i]=log[i/2]+1;
}
inline int max(int a,int b)
{
	if (a>b)
		return a;
	return b;
}
void make_rmq()
{
	int i,j,k,t,p;
	for (i=1; (1<<i)<=n; i++)
	{
		t=1<<i;
		p=1<<(i-1);
		for (j=1; j<=n-t+1; j++)
			for (k=1; k<=n-t+1; k++)
				rmq[i][j][k]=max(max(rmq[i-1][j][k],rmq[i-1][j][k+p]),
								 max(rmq[i-1][j+p][k],rmq[i-1][j+p][k+p]));
	}
}
int query(int x,int y,int z)
{
	int t=log[z],p,q,r;
	r=1<<t;
	p=max(rmq[t][x][y],rmq[t][(x+z-1)-r+1][(y+z-1)-r+1]);
	q=max(rmq[t][x][(y+z-1)-r+1],rmq[t][(x+z-1)-r+1][y]);
	if (q>p)
		p=q;
	return p;
}
int main()
{
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	read();
	make_rmq();
	int i,x,y,z;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		printf("%d\n",query(x,y,z));
	}
	return 0;
}