Cod sursa(job #20046)

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

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

int minim(int x,int y)
{
if(x<y)
  return y;
return x;  
}

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