Cod sursa(job #2344056)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 14 februarie 2019 18:21:04
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in ( "plantatie.in" ) ;
ofstream out ( "plantatie.out" ) ;

int rmq [ 10 ][ 501 ][ 501 ] , lg [ 502 ] , best ;

int main()
{
    int i , n , j , m , k ;
    in >> n >> m ;
    for ( i = 2 ; i <= n ; ++ i )    lg [ i ] = lg [ i >> 1 ] + 1 ;
    for ( i = 1 ; i <= n ; ++ i )
    for ( j = 1 ; j <= n ; ++ j )
    {
        in >> rmq [ 0 ][ i ][ j ] ;
    }
    for ( k = 1 ; ( 1 << k ) <= n ; ++ k )
    for ( i = 1 ; i + ( 1 << k ) <= n + 1 ; ++ i )
    for ( j = 1 ; j + ( 1 << k ) <= n + 1 ; ++ j )
{
    rmq [ k ][ i ][ j ] = rmq [ k - 1 ][ i ][ j ] ;
    rmq [ k ][ i ][ j ] = max ( rmq [ k ][ i ][ j ] , rmq [ k - 1 ][ i + ( 1 << ( k - 1 ) ) ][ j ] ) ;
    rmq [ k ][ i ][ j ] = max ( rmq [ k ][ i ][ j ] , rmq [ k - 1 ][ i ][ j + ( 1 << ( k - 1 ) ) ] ) ;
    rmq [ k ][ i ][ j ] = max ( rmq [ k ][ i ][ j ] , rmq [ k - 1 ][ i + ( 1 << ( k - 1 ) ) ][ j + ( 1 << ( k - 1 ) ) ] ) ;
}
    while ( m -- )
    {
        int x , y , z ;
        in >> x >> y >> z ;
        best = rmq [ lg [ z ] ][ x ][ y ] ;
        best = max ( best , rmq [ lg [ z ] ][ x ][ y + z - ( 1 << lg [ z ] ) ] ) ;
        best = max ( best , rmq [ lg [ z ] ][ x + z - ( 1 << lg [ z ] ) ][ y ] ) ;
        best = max ( best , rmq [ lg [ z ] ][ x + z - ( 1 << lg [ z ] ) ][ y + z - ( 1 << lg [ z ] ) ] ) ;
        out << best << '\n' ;
    }
    return 0;
}