Cod sursa(job #3041681)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 1 aprilie 2023 00:57:06
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>

using namespace std;

const int NMAX = 500;
const int LOG = 8;

int mat[1 + NMAX][1 + NMAX];

int log2[1 << (1 + LOG)];
int rmq[1 + NMAX][1 + NMAX][1 + LOG];

/// Query-urile sunt mereu sub forma de patrat si nu avem operatia de update pe matrice,
/// deci putem face un RMQ 2-D,
/// deci nu e nevoie de arbori de intervale 2-D sau alte nebunii.

void preCalcRMQ(int n)
{
    int putere2 = 1;
    int exp = 0;

    for (int i = 1; i <= n; i++)
    {
        if (putere2 * 2 <= i)
        {
            putere2 *= 2;
            exp++;
        }

        log2[i] = exp;
    }

    for (int l = 1; (1 << l) <= n; l++)
    {
        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 x, int y, int lat)
{
    int lg = log2[lat];

    return max(
               max(rmq[x][y][lg],
                   rmq[x + lat - 1 - (1 << lg) + 1][y][lg]),
               max(rmq[x + lat - 1 - (1 << lg) + 1][y + lat - 1 - (1 << lg) + 1][lg],
                   rmq[x][y + lat - 1 - (1 << lg) + 1][lg])
               );
}

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

    int n, m;
    in >> n >> m;

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

    preCalcRMQ(n);

    for (int i = 1; i <= m; i++)
    {
        int x, y, lat;
        in >> x >> y >> lat;

        out << solutie(x, y, lat) << '\n';
    }

    in.close();
    out.close();

    return 0;
}