Cod sursa(job #360886)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 2 noiembrie 2009 18:35:16
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#define Nmax 513
#define NNmax 1003
#define Mmax 75001
#define Logmax 10

int m[NNmax][NNmax][Logmax]; // m[i][j][k] = elem max din patrat cu colt st. sus i,j si lg lat 2^k
int a[Nmax][Nmax],lg[Nmax];
int n,mm,i,j,k,q,nk,p,sol;
int max(int x,int y){ return x>y ? x:y; }

int main(){
	freopen("plantatie.in","r",stdin);
   freopen("plantatie.out","w",stdout);
   scanf("%d%d",&n,&mm);
   for(i=1;i<=n;++i)
     for(j=1;j<=n;++j) scanf("%d",&a[i][j]);

   for(nk=0; (1<<nk) < Nmax; nk++) lg[(1<<nk)]=nk;
   for(i=1;i<Nmax;++i)
     if(!lg[i]) lg[i]=lg[i-1];
   nk=lg[n];
   
   // initializez
   for(i=1;i<=n;++i)
     for(j=1;j<=n;++j)
       m[i][j][0] = a[i][j];

   for(k=1; k<=nk; ++k)
      for(i=1;i<=n;++i)
         for(j=1;j<=n;++j)
       		m[i][j][k] = max( max(m[i][j][k-1], m[i+(1<<(k-1))][j+(1<<(k-1))][k-1]),
                              max(m[i][j+(1<<(k-1))][k-1], m[i+(1<<(k-1))][j][k-1]) );


   for(q=1;q<=mm;++q){
   	scanf("%d%d%d",&i,&j,&k);
      p = lg[k];
      sol = max( max(m[i][j][p], m[i+k-(1<<p)][j+k-(1<<p)][p]),
      			  max(m[i+k-(1<<p)][j][p], m[i][j+k-(1<<p)][p]) );
   	printf("%d\n",sol);
   }

   fclose(stdin); fclose(stdout);
   return 0;
}