Cod sursa(job #2849341)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 14 februarie 2022 22:04:48
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <stdio.h>
 
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")

/*
metoda de pe codeforces O( N^2 * logN^2 )
incerc cv mai bun =)))))))))))))) O( N^2*logN )

for( int i = 0; i < n; i++ ) {
            for( int c = 0; c < m; c++ )
                rmq[ 0 ][ i ][ 0 ][ c ] = a[ i ][ j ];

            for( int left = 1; ( 1 << left ) <= m; left++ ) {
                int k = ( 1 << ( left - 1 ) );
                for( int right = 0; right + k < m; right++ )
                    rmq[ 0 ][ i ][ left ][ right ] = min( rmq[ 0 ][ i ][ left - 1 ][ right ], rmq[ 0 ][ i ][ left - 1 ][ right + k ] );
            }
        }
        
        for( int left_lin = 1; ( 1 << left_lin ) <= n; left_lin++ )
            for( int right_lin = 0; right_lin < n; right_lin++ )
                for( int left_col = 0; ( 1 << left_col ) <= m; left_col++ )
                    for( int right_col = 0; right_col < m; right_col++ )
                        rmq[ left_lin ][ right_lin ][ left_col ][ right_col ] = min( rmq[ left_lin - 1 ][ right_lin ][ left_col ][ right_col ], rmq[ left_lin - 1 ][ right_lin + k ][ left_col ][ right_col ] );
  
*/

static inline int max2( const int& a, const int& b ) {
    return ( a >= b ? a : b );
}

static inline int max( const int& a, const int& b, const int& c, const int& d ) {
    return max2( max2( a, d ), max2( b, c ) );
}

#define MAX 500
int rmq[ 11 ][ MAX + 1 ][ MAX + 1 ];
int logdoi[ MAX + 1 ];
int n, q;

int main()
{
    FILE *fin = fopen( "plantatie.in", "r" );
    fscanf( fin, "%d %d", &n, &q );
    for( int i = 1; i <= n; i++ )
        for( int c = 1; c <= n; c++ )
            fscanf( fin, "%d", &rmq[ 0 ][ i ][ c ] );

    {
        logdoi[ 1 ] = 0;
        for( int i = 2; i <= n; i++ )
            logdoi[ i ] = logdoi[ i >> 1 ] + 1;

        for( int i = 1; ( 1 << i ) <= n; i++ ) {
            int k = ( 1 << ( i - 1 ) );
            for( int l = 1; l + k <= n; l++ )
                for( int c = 1; c + k <= n; c++ )
                    rmq[ i ][ l ][ c ] = max( rmq[ i - 1 ][ l ][ c ], rmq[ i - 1 ][ l + k ][ c ], rmq[ i - 1 ][ l ][ c + k ], rmq[ i - 1 ][ l + k ][ c + k ] );
        }
    }


    int lin, col, L;
    FILE *fout = fopen( "plantatie.out", "w" );
    while( q-- ) {
        fscanf( fin, "%d %d %d", &lin, &col, &L );
        int k = logdoi[ L ];
        int K = ( 1 << k );
        int maxx = max( rmq[ k ][ lin ][ col ], rmq[ k ][ lin + L - K ][ col ], rmq[ k ][ lin ][ col + L - K ], rmq[ k ][ lin + L - K ][ col + L - K ] );
        fprintf( fout, "%d\n", maxx );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}