Cod sursa(job #1245091)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 18 octombrie 2014 17:08:20
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<fstream>

using namespace std;

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

const int nmax = 500;
const int logmax = 9;
int n, m, pr[ nmax + 1 ];
int d[ nmax + 1 ][ nmax + 1 ][ logmax + 1 ];

inline int max4( int a, int b, int c, int d ) {
    int sol = a;
    if ( sol < b ) { sol = b; }
    if ( sol < c ) { sol = c; }
    if ( sol < d ) { sol = d; }
    return sol;
}
int memo( int x ) {
    if ( pr[ x ] > 0 ) {
        return pr[ x ];
    } if ( x == 1 ) {
        return 0;
    } else {
        return ( pr[ x ] = memo( x / 2 ) + 1 );
    }
}
void read() {
    fin >> n >> m;
    for( int i = 1; i <= n; ++ i ) {
        for( int j = 1; j <= n; ++ j ) {
            fin >> d[ i ][ j ][ 0 ];
        }
    }
}
void solve() {
    for( int k = 1, p = 1; (p << 1) <= n; ++ k, p <<= 1 ) {
        for( int i = (p << 1); i <= n; ++ i ) {
            for( int j = (p << 1); j <= n; ++ j ) {
                d[ i ][ j ][ k ] = max4( d[ i ][ j ][ k - 1 ],
                                         d[ i - p ][ j ][ k - 1 ],
                                         d[ i ][ j - p ][ k - 1 ],
                                         d[ i - p ][ j - p ][ k - 1 ] );
            }
        }
    }
}
int main() {
    int x, y, k, t, x1, y1;
    read();

    solve();

    for( ; m > 0; -- m ) {
        fin >> x >> y >> k;
        t = memo( k );
        x += k - 1; y += k - 1;
        x1 = x - k + (1 << t);
        y1 = y - k + (1 << t);
        fout << max4( d[ x ][ y ][ t ],d[ x1 ][ y ][ t ],d[ x ][ y1 ][ t ],d[ x1 ][ y1 ][ t ] ) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}