Cod sursa(job #29224)

Utilizator pocaituDavid si Goliat pocaitu Data 8 martie 2007 19:55:55
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream.h>
#define nmax 602
int long max[nmax][nmax][20],n,a[nmax][nmax];
inline int long maxim(int long a,int long b) {return a>b?a:b;}

void init_max()
{int long i,k,j,jj;
for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
   max[i][j][0]=a[i][j];

for(i=1;(1<<i)<=n;i++)
  for(j=1;j<=n;j++)
	 for(jj=1;jj<=n;jj++)
		{max[j][jj][i]=max[j][jj][i-1];
		 if(max[j][jj+(1<<(i-1))][i-1]>max[j][jj][i])
			max[j][jj][i]=max[j][jj+(1<<(i-1))][i-1];
		 if(max[j][jj][i]<max[j+(1<<(i-1))][jj][i-1])
		   max[j][jj][i]=max[j+(1<<(i-1))][jj][i-1];
		 if(max[j][jj][i]<max[j+(1<<(i-1))][jj+(1<<(i-1))][i-1])

		   max[j][jj][i]=max[j+(1<<(i-1))][jj+(1<<(i-1))][i-1];
		 }
}


int long rezolva(int long x,int long y,int long k)
{int long r,j=15;
 for(;j>=0;j--)
   if(k&(1<<j))
	 break;
 r=k-(1<<j);
 return maxim(maxim(max[x][y][j],max[x+r][y+r][j]),maxim(max[x+r][y][j],max[x][y+r][j]));
 }



int main()
{ifstream f("plantatie.in");
 int long m,i,j,x,y,z;
 f>>n>>m;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   f>>a[i][j];
 init_max();
 ofstream g("plantatie.out");
 for(i=1;i<=m;i++)
  {f>>x>>y>>z;
   g<<rezolva(x,y,z)<<"\n";
   }
 g.close();
 return 0;
 }