Cod sursa(job #2446397)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 8 august 2019 18:58:58
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;

ifstream f ("plantatie.in");
ofstream g ("plantatie.out");
int n, m;

int rmq[505][505][12];
int lg[505];

void Precalculare_RMQ()
{
    for (int l=1; (1<<l) <= n; ++l)
    {
        if (l==0) continue;

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

int solutie (int i, int j, int lat)
{
    int aux=lg[lat];
    int dri=i+lat, drj=j+lat;
    int sol=0;
    sol=max(max(rmq[i][j][aux], rmq[dri-(1<<aux)][j][aux]), max(rmq[i][drj-(1<<aux)][aux], rmq[dri-(1<<aux)][drj-(1<<aux)][aux]));
    return sol;
}
int main()
{
    f>>n>>m;

    for (int i=1; i<=n; ++i)
        for (int j=1; j<=n; ++j)
            f>>rmq[i][j][0];

    Precalculare_RMQ();

    lg[1]=0;
    for (int i=2; i<=n; ++i)
        lg[i]=lg[i/2]+1;

    for (; m; --m)
    {
        int x, y, l;
        f>>x>>y>>l;
        g<<solutie(x, y, l)<<'\n';
    }
    return 0;
}