Cod sursa(job #18308)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 18 februarie 2007 11:23:17
Problema Plantatie Scor 60
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasa a 10-a Marime 1.31 kb
#include <stdio.h>
#define d (1<<(k-1))

int A[11][501][501],n,t;

void ReadData ()
{
    int i,j;
    freopen ( "plantatie.in" , "r" , stdin );
    scanf ( "%d %d" , &n , &t );
    for ( i=0 ; i<n ; i++ )
        for (j=0; j<n ; j++ )
            scanf ( "%d" , &A[0][i][j] );
}

int max ( int a1 , int a2 , int a3 , int a4)
{
 int x,y;
 x= (a1<a2)?(a2):(a1);
 y= (a3<a4)?(a4):(a3);
 return (x>y) ? (x) : (y);
}

void PreprocessData ()
{
    int i,j,k;
    for ( k=1 ; 1<<k<=n ; k++ )
        for ( i=0 ; i<n-(d<<1)+1 ; i++ )
            for ( j=0 ; j<n-(d<<1)+1; j++ )
                A[k][i][j]=max ( A[k-1][i][j] , A[k-1][i+d][j] , A[k-1][i][j+d] , A[k-1][i+d][j+d] );
}

int Answer ( int x , int y , int l )
{
    int k;
    for ( k=0 ; 1<<(k+1) <= l ; k++ );
    return
		max ( A[k][x][y] , A[k][x+l-(d<<1)][y] , A[k][x][y+l-(d<<1)] , A[k][x+l-(d<<1)][y+l-(d<<1)] );
}

void AnswerQuestions ()
{
    int i,q,x,y,l;
    freopen ( "plantatie.out" , "w" , stdout );
    for ( i=0 ; i<t ; i++ ) {
        scanf ( "%d %d %d" , &x , &y , &l );
        q = Answer ( x-1 , y-1 , l );
        printf ( "%d\n" , q );
    }
    fclose ( stdin );
    fclose (stdout );
}

int main ()
{
    ReadData ();
    PreprocessData ();
    AnswerQuestions ();
    //say goodbye :D
    return 0;
}