Cod sursa(job #2849342)

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

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;
}