Cod sursa(job #18180)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 18 februarie 2007 10:24:48
Problema Plantatie Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.6 kb
#include<fstream.h>
int long max[501][501][10],n,a[501][501];
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 z,int long zz)
{int long i,j,maxim;
 if((!z)||(!zz))
   return -1;
 if(z>=zz)
   {for(i=15;i>=0;i--)
	 if((1<<i)&zz)
	   {maxim=rezolva(x,y+(1<<i),z,zz-(1<<i));

		for(j=0;j<z/(1<<i);j++)
		  if(maxim<max[x+j*(1<<i)][y][i])
			maxim=max[x+j*(1<<i)][y][i];
		if(maxim<rezolva(j*(1<<i),y,z%(1<<i),1<<i))
		maxim=rezolva(j*(1<<i),y,z%(1<<i),1<<i);
		return maxim;
		}
	}
 else
  {for(i=15;i>=0;i--)
	if((1<<i)&z)
	  {maxim=rezolva(x+(1<<i),y,z-(1<<i),zz);
	   for(j=0;j<zz/(1<<i);j++)
		if(maxim<max[x][y+j*(1<<i)][i])
			maxim=max[x][y+j*(1<<i)][i];
	   if(maxim<rezolva(x,y+j*(1<<i),1<<i,zz%(1<<i)))
		  maxim=rezolva(x,y+j*(1<<i),1<<i,zz%(1<<i));
	   return maxim;
	   }
   }
  }



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,z)<<"\n";

   }
 g.close();
 return 0;
 }