Cod sursa(job #80225)

Utilizator floringh06Florin Ghesu floringh06 Data 26 august 2007 22:30:47
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
using namespace std;
#define nmax 515

#include<stdio.h>

FILE *fin=fopen("plantatie.in","r"),
     *fout=fopen("plantatie.out","w");
     
int i,j,n,m,p,k,ii,pw;
int opt[nmax][nmax][12];     


int maxim(int a, int b, int c, int d)
 {
  int max=-10000;
  if (a>max) max=a;
  if (b>max) max=b;
  if (c>max) max=c;
  if (d>max) max=d;
  return max;
 }

void gosolve()
 {
   int pw;
   pw=1;
   for (k=1; k<=p; k++)
    {
     for (i=1; i<=n; i++)
      for (j=1; j<=n; j++)
      if (i+pw<=n && j+pw<=n) 
       opt[i][j][k]=maxim(opt[i][j][k-1],opt[i][j+pw][k-1],opt[i+pw][j][k-1],opt[i+pw][j+pw][k-1]);
      pw<<=1;
    }
 }    

     
int main()
{
    fscanf(fin,"%d%d",&n,&m);
    p=1;
    while ((1<<p)<=n) p++;
    p--;
    for (i=1; i<=n; i++)
     for (j=1; j<=n; j++)
      fscanf(fin,"%d",&opt[i][j][0]);
    gosolve();
    fscanf(fin,"\n");
    for (ii=1; ii<=m ; ii++)
     {
       fscanf(fin,"%d%d%d",&i,&j,&k);
       pw=1; p=1;
       while ((1<<p)<=k) 
        { p++; pw<<=1; }
       p--;
       fprintf(fout,"%d\n",maxim(opt[i][j][p],opt[i][j+k-pw][p],opt[i+k-pw][j][p],opt[i+k-pw][j+k-pw][p])); 
     }
  fclose(fin);
  fclose(fout);
 return 0;
}