Cod sursa(job #539233)

Utilizator SpiderManSimoiu Robert SpiderMan Data 22 februarie 2011 18:12:53
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
# include <cstdio>

# define max(a, b) ( a > b ? a : b )

const char *FIN = "plantatie.in", *FOU = "plantatie.out" ;
const int MAX = 505, MAx = 15 ;

int dp[MAx][MAX][MAX] ;
int pt[MAX] ;
int N, M, i, j, k ;

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    scanf ( "%d %d", &N, &M ) ;
    for ( i = 1; i <= N; ++i ) {
        for ( j = 1; j <= N; ++j ) {
            scanf ( "%d", dp[0][i] + j ) ;
        }
    }

    for ( k = 1; 1 << k <= N; ++k ) {
        for ( i = 1; i <= N - ( 1 << k ) + 1; ++i ) {
            for ( j = 1; j <= N - ( 1 << k ) + 1; ++j ) {
                dp[k][i][j] = max ( max ( dp[k - 1][i][j], dp[k - 1][i][j + ( 1 << k - 1 )] ),
                                    max ( dp[k - 1][i + ( 1 << k - 1 )][j], dp[k - 1][i + ( 1 << k - 1)][j + ( 1 << k - 1 )] ) ) ;
            }
        }
    }

    for ( i = 2; i <= N; ++i ) {
        pt[i] = pt[i >> 1] + 1 ;
    }

    for ( ; M ; --M ) {
        scanf ( "%d %d %d", &i, &j, &k ) ;
        printf ( "%d\n", max ( max ( dp[pt[k]][i][j], dp[pt[k]][i + k - ( 1 << pt[k] )][j + k - ( 1 << pt[k] )] ),
                               max ( dp[pt[k]][i][j + k - ( 1 << pt[k] )], dp[pt[k]][i + k - ( 1 << pt[k] )][j] ) ) ) ;
             }
         }