Cod sursa(job #36056)

Utilizator megabyteBarsan Paul megabyte Data 22 martie 2007 21:44:49
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#define INF "plantatie.in"
#define OUF "plantatie.out"
#define NMAX 512
int rmq[NMAX][NMAX][10]={0},n,m;
void preproc()
{
	register int i,j,k,ii,jj,max;
	for(k=1;(1<<k)<=n;k++)
	{
//	printf("%d ",k); 
		for(i=1;i<=n;i++)
		   for(j=1;j<=n;j++)
		   {
			   ii=i-(1<<(k-1));
			   jj=j-(1<<(k-1));
			   if(ii<=0) ii=1;
			   if(jj<=0) jj=1;
			   max=rmq[i][j][k-1];
			   if(max<rmq[i][jj][k-1]) max=rmq[i][jj][k-1];
			   if(max<rmq[ii][j][k-1]) max=rmq[ii][j][k-1];
			   if(max<rmq[ii][jj][k-1]) max=rmq[ii][jj][k-1];
			   rmq[i][j][k]=max;
		   }
	}
//	printf("\n");
}
int main()
{
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	int i,j,x,y,z,lg,ii,jj,max;
	fscanf(in,"%d %d",&n,&m);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++) fscanf(in,"%d",&rmq[i][j][0]);
	preproc();
	/*for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++) printf("%d ",rmq[i][j][1]);
		printf("\n");
	}*/
	for(i=1;i<=m;i++)
	{
		fscanf(in,"%d %d %d",&x,&y,&z);
	        x+=z-1;y+=z-1; 
		lg=0;
		while((1<<(lg+1))<=z) lg++;
                j=1<<lg;
//		printf("%d %d %d\n",x,y,lg);	
        	ii=x-z+j;
		jj=y-z+j;
		max=rmq[x][y][lg];
		if(ii>x-z&&rmq[ii][y][lg]>max) max=rmq[ii][y][lg];
	        if(jj>y-z&&rmq[x][jj][lg]>max) max=rmq[x][jj][lg];
	        if(ii>x-z&&jj>y-z&&rmq[ii][jj][lg]>max) max=rmq[ii][jj][lg];
		fprintf(out,"%d\n",max);
	}
	fclose(in);fclose(out);
	return 0;
}