Cod sursa(job #1746823)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 23 august 2016 23:20:53
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
# include <iostream>
# include <fstream>

# include <algorithm>

# define max4( a, b, c, d ) max( max( a, b ), max( c, d ) )

using namespace std;

# define MAX_N 500
# define LOG_N 10

int rmq[LOG_N][MAX_N][MAX_N];

int log2( int n ) {
    if ( n == 1 )
        return 0;
    else
        return 1 + log2( n >> 1 );
}

int main() {
    ifstream fin( "plantatie.in" );
    ofstream fout( "plantatie.out" );

    int n, m, i, j, k, a, b, l, g;

    fin >> n >> m;

    for ( i = 0; i < n; i ++ )
        for ( j = 0; j < n; j ++ )
            fin >> rmq[0][i][j];

    # define s ( 1 << k )
    for ( k = 1; k <= log2( n ); k ++ )
        for ( i = 0; i < n; i ++ )
            for ( j = 0; j < n; j ++ )
                rmq[k][i][j] = max4(
                                     rmq[k - 1][i][j],
                                     rmq[k - 1][i + s / 2][j],
                                     rmq[k - 1][i + s / 2][j + s / 2],
                                     rmq[k - 1][i][j + s / 2]
                                   );
    # undef s

    for ( i = 0; i < m; i ++ ) {
        fin >> a >> b >> l;
        a --;
        b --;

        g = log2( l );

        # define s ( 1 << g )
        fout << max4(
                        rmq[g][a][b],
                        rmq[g][a][b + l - s],
                        rmq[g][a + l - s][b],
                        rmq[g][a + l - s][b + l - s]
                    ) << '\n';
        # undef s
    }

    fin.close();
    fout.close();

    return 0;
}