Cod sursa(job #999938)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 21 septembrie 2013 18:39:55
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax  = 502;
const int LgMax = 10;

int A[Nmax][Nmax];
int rmq[LgMax][Nmax][Nmax], lg[Nmax];

int N, M;

void RMQ()
{
    for ( int i = 2; i < Nmax; ++i )
            lg[i] = lg[i / 2] + 1;

    for ( int i = 1; i <= N; ++i )
            for ( int j = 1; j <= N; ++j )
                    rmq[0][i][j] = A[i][j];

    for ( int k = 1; k <= lg[N]; ++k )
    {
        int p = 1 << ( k - 1 );

        for ( int i = 1; i + p <= N; ++i )
                for ( int j = 1; j + p <= N; ++j )
                {
                    int max1 = max( rmq[k - 1][i][j], rmq[k - 1][i + p][j] );
                    int max2 = max( rmq[k - 1][i][j + p], rmq[k - 1][i + p][j + p] );

                    rmq[k][i][j] = max( max1, max2 );
                }
    }
}

int query( int i, int j, int k )
{
    int l = lg[k];
    int p = 1 << l;

    int max1 = max( rmq[l][i][j], rmq[l][i][j + k - p] );
    int max2 = max( rmq[l][i + k - p][j], rmq[l][i + k - p][j + k - p] );

    return max( max1, max2 );
}

int main()
{
    ifstream f("plantatie.in");
    ofstream g("plantatie.out");

    f >> N >> M;

    for ( int i = 1; i <= N; ++i )
            for ( int j = 1; j <= N; ++j )
                    f >> A[i][j];

    RMQ();

    for ( int i = 1, a, b, c; i <= M; ++i )
    {
        f >> a >> b >> c;

        g << query( a, b , c) << "\n";
    }

    return 0;
}