Cod sursa(job #20052)

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

int a[nmax][nmax][21];

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=23;
int x,y,z;    
while(((1<<lim)&n)==0) lim--;
    
for(k=1;k<=lim;k++)
  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+(1<<(k-1))][j][k-1])
           x=a[i][j][k-1];
       else
           x=a[i+(1<<(k-1))][j][k-1];
           
       if(a[i][j+(1<<(k-1))][k-1]>a[i+(1<<(k-1))][j+(1<<(k-1))][k-1])
           y=a[i][j+(1<<(k-1))][k-1];
       else
           y=a[i+(1<<(k-1))][j+(1<<(k-1))][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=23;
  while((k&(1<<lim))==0) lim--;
  
  if(a[i][j][lim]>a[i+k-(1<<lim)][j][lim])
     x=a[i][j][lim];
  else
     x=a[i+k-(1<<lim)][j][lim];
  
  if(a[i][j+k-(1<<lim)][lim]>a[i+k-(1<<lim)][j+k-(1<<lim)][lim])
     y=a[i][j+k-(1<<lim)][lim];
  else
     y=a[i+k-(1<<lim)][j+k-(1<<lim)][lim];
     
  if(x>y)
    z=x;
  else
    z=y;
  
  fprintf(fout,"%d\n",z);               
  }
  
fclose(fin);
fclose(fout);
return 0;
}