Cod sursa(job #1762463)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 23 septembrie 2016 16:07:00
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>

int r[501][501][10];
int logx[501];

using namespace std;

int max( int a, int b, int c, int d )
{
    if( b>a )
        a=b;

    if( c>a )
        a=c;

    if( d>a )
        a=d;

    return a;
}

int main()
{
    freopen( "plantatie.in", "r", stdin );
    freopen( "plantatie.out", "w", stdout );

    int n, m, k, x, y, i, j, l, rez;

    scanf( "%d%d", &n, &m );

    for( i=1;i<=n;i++ )
        for( j=1;j<=n;j++ )
        {
            scanf( "%d", &r[i][j][0] );

            for( l=1;(1<<l)<=i && (1<<l)<=j;l++ )
                r[i][j][l]=max(r[i][j][l-1],
                               r[i][j-(1<<(l-1))][l-1],
                               r[i-(1<<(l-1))][j][l-1],
                               r[i-(1<<(l-1))][j-(1<<(l-1))][l-1]);
        }

    logx[1]=0;

    for( i=2;i<=n;i++ )
        logx[i]=1+logx[i/2];

    for( i=1;i<=m;i++ )
    {
        scanf( "%d%d%d", &x, &y, &k );

        l=logx[k];

        rez=max(r[x+(1<<l)-1][y+(1<<l)-1][l],
                r[x+(1<<l)-1][y+k-1][l],
                r[x+k-1][y+(1<<l)-1][l],
                r[x+k-1][y+k-1][l]);

        printf( "%d\n", rez );
    }

    return 0;
}