Cod sursa(job #131456)

Utilizator FlorianFlorian Marcu Florian Data 3 februarie 2008 20:07:08
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
FILE*f=fopen("plantatie.in","r");
FILE*g=fopen("plantatie.out","w");
int a[506][506][20];
int n,m;
void read()
 {
 fscanf(f,"%d %d",&n,&m);
 for(int i=1;i<=n;++i)
   for(int j=1;j<=n;++j)
     fscanf(f,"%d",&a[i][j][0]);
 }
int max(int a, int b, int c, int d)
  {
  if(a>=b && a>=c && a>=d) return a;
  else if(b>=a && b>=c && b>=d) return b;
  else if(d>=c && d>=a && d>=b) return d;
  else return c;
  }
void proceseaza()
 {
 int i,j,k;
 //pt k=0 => patratele de latura 1:
 k=1;
 while((1<<k)<=n)
     {
     for(i=1;i<=n;++i)
       for(j=1;j<=n;++j)
         a[i][j][k]=max(a[i][j][k-1],a[i][j+(1<<(k-1))][k-1],a[i+(1<<(k-1))][j][k-1],a[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
     ++k;
     }

 }
int main()
  {
  int i,j,k,sol,p;
  read();
  proceseaza();
  while(m--)
    {
     fscanf(f,"%d %d %d",&i,&j,&k);
     p=0;
     while((1<<p)<=k) ++p;
     p--;
     sol=max(a[i][j][p],a[i][j+k-(1<<p)][p],a[i+k-(1<<p)][j][p],a[i+k-(1<<p)][j+k-(1<<p)][p]);
     fprintf(g,"%d\n",sol);

    }
  return 0;
  }