Cod sursa(job #1043118)

Utilizator Teodor94Teodor Plop Teodor94 Data 28 noiembrie 2013 00:24:05
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>

#define MAX_N 500
#define MAX_LOG 9

int rmq[MAX_LOG][MAX_N][MAX_N];
int log2[MAX_N];

inline int max( int x, int y ) {
    return x > y ? x : y;
}

void read( FILE *fin, int &n, int &m ) {
    fscanf( fin, "%d%d", &n, &m );
    for ( int i = 0; i < n; ++i )
        for ( int j = 0; j < n; ++j )
            fscanf( fin, "%d", &rmq[0][i][j] );
}

void gen_rmq( int n ) {
    for ( int len = 1; ( 1 << len ) <= n; ++len )
        for ( int i = 0; i < n; ++i )
            for ( int j = 0; j < n; ++j ) {
                rmq[len][i][j] = rmq[len - 1][i][j];

                int half = 1 << ( len - 1 );
                if ( i + half < n && j + half < n )
                    rmq[len][i][j] = max( rmq[len][i][j], rmq[len - 1][i + half][j + half] );
                if ( i + half < n )
                    rmq[len][i][j] = max( rmq[len][i][j], rmq[len - 1][i + half][j] );
                if ( j + half < n )
                    rmq[len][i][j] = max( rmq[len][i][j], rmq[len - 1][i][j + half] );
            }
}

void pregen_log2( int n ) {
    for ( int i = 2; i <= n; ++i )
        log2[i] = log2[i >> 1] + 1;
}

int main() {
    FILE *fin, *fout;

    fin = fopen( "plantatie.in", "r" );
    int n, m;
    read( fin, n, m );

    gen_rmq( n );
    pregen_log2( n );

    fout = fopen( "plantatie.out", "w" );
    while ( m ) {
        int x1, y1, side;
        fscanf( fin, "%d%d%d", &x1, &y1, &side );
        --x1, --y1;
        int x2 = x1 + side - 1, y2 = y1 + side - 1;

        int len = log2[side];
        int ans = rmq[len][x1][y1];
        ans = max( ans, rmq[len][x2 - ( 1 << len ) + 1][y1] );
        ans = max( ans, rmq[len][x1][y2 - ( 1 << len ) + 1] );
        ans = max( ans, rmq[len][x2 - ( 1 << len ) + 1][y2 - ( 1 << len ) + 1] );

        fprintf( fout, "%d\n", ans );

        --m;
    }

    fclose( fin );
    fclose( fout );
}