Cod sursa(job #20130)

Utilizator moga_florianFlorian MOGA moga_florian Data 20 februarie 2007 19:23:07
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
using namespace std;
#include<fstream>
#include<stdio.h>
#define nmax 505

int a[nmax][nmax][12];

int main()
{
FILE *fin=fopen("plantatie.in","r"),
     *fout=fopen("plantatie.out","w");
     
int n,m;
int i,j,k;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
    fscanf(fin,"%d",&a[i][j][0]);
    
int lim=11;
int x,y,z,cst;    
while(((1<<lim)&n)==0) lim--;
    
for(k=1;k<=lim;k++)
  {
  cst=1<<(k-1);
  for(i=1;i<=n-(1<<k)+1;i++)
    for(j=1;j<=n-(1<<k)+1;j++)
       {
       if(a[i][j][k-1]>a[i+cst][j][k-1])
           x=a[i][j][k-1];
       else
           x=a[i+cst][j][k-1];
           
       if(a[i][j+cst][k-1]>a[i+cst][j+cst][k-1])
           y=a[i][j+cst][k-1];
       else
           y=a[i+cst][j+cst][k-1];
           
       if(x>y)
         a[i][j][k]=x;
       else
         a[i][j][k]=y;                  
       }
   }
int xx;
for(xx=1;xx<=m;xx++)
  {
  fscanf(fin,"%d%d%d",&i,&j,&k);
  lim=11;
  while((k&(1<<lim))==0) lim--;
  cst=k-(1<<lim);
  
  if(a[i][j][lim]>a[i+cst][j][lim])
     x=a[i][j][lim];
  else
     x=a[i+cst][j][lim];
  
  if(a[i][j+cst][lim]>a[i+cst][j+cst][lim])
     y=a[i][j+cst][lim];
  else
     y=a[i+cst][j+cst][lim];
     
  if(x>y)
    z=x;
  else
    z=y;
  
  fprintf(fout,"%d\n",z);               
  }
  
fclose(fin);
fclose(fout);
return 0;
}