Cod sursa(job #18613)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 18 februarie 2007 12:47:15
Problema Plantatie Scor 60
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.72 kb
#include<stdio.h>
int long max[501][501][9][1],n;

void init_max()
{int long i,j,k,d;
for(k=1;(1<<k)<=n;k++)
  for(i=1;i<=n;i++)
  {for(j=1;j+(1<<k)-1<=n;j++)
	 {max[i][j][k][0]=max[i][j][k-1][0];
	 if(max[i][j][k][0]<max[i][j+(1<<(k-1))][k-1][0])
		max[i][j][k][0]=max[i][j+(1<<(k-1))][k-1][0];
	 }
  for(;j<=n;j++)
   max[i][j][k][0]=max[i][j][k-1][0];
   }
 /*for(k=0;(1<<k)<=n;k++)
	for(i=1;i<=n;i++)
	 for(j=1;j<=n;j++)
	   {max[i][j][k][1]=max[i][j][k][0];
		for(d=1;d<=4&&d+i<n;d++)
		if(max[i][j][k][1]<max[i+d][j][k][0])
			max[i][j][k][1]=max[i+d][j][k][0];
		}
 for(k=0;(1<<k)<=n;k++)
	for(i=1;i<=n;i++)
	 for(j=1;j<=n;j++)
	   {max[i][j][k][2]=max[i][j][k][1];
		for(d=5;d<=20&&d+i<;d+=5)
		 if(max[i][j][k][2]<max[i+d][j][k][1])
			max[i][j][k][2]=max[i+d][j][k][1];
		} */
}

int long rezolva(int long x,int long y,int long z,int long zz)
{int long i,j,ii,maxim=-2000000000;

 for(i=10;i>=0;i--)
   if(zz&(1<<i))
	 {/*for(j=0;j<z/25;j++)
		if(maxim<max[x+j*25][y][i][2])
		   maxim=max[x+j*25][y][i][2];
	  for(ii=0;ii<(z%25)/5;ii++)
		if(maxim<max[x+j*25+ii*5][y][i][1])
		   maxim=max[x+j*25+ii*5][y][i][1];*/
	  /*for(j=ii*5+j*25;j<z+i;j++)
		if(maxim<max[x+j][y][i][0])
		   maxim=max[x+j][y][i][0];*/
	  for(j=x;j<x+z;j++)
		if(maxim<max[j][y][i][0])
		   maxim=max[j][y][i][0];
	  y+=(1<<i);
	  }
 return maxim;
 }






int main()
{freopen("plantatie.in","r",stdin);
 int long i,j,x,y,z,m;
 scanf("%ld%ld",&n,&m);

 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   scanf("%ld",&max[i][j][0][0]);
 init_max();
 freopen("plantatie.out","w",stdout);
 for(i=1;i<=m;i++)
  {scanf("%ld%ld%ld",&x,&y,&z);
   printf("%ld\n",rezolva(x,y,z,z));
	}
 fclose(stdout);
 return 0;
 }