Cod sursa(job #2753894)

Utilizator icnsrNicula Ionut icnsr Data 24 mai 2021 17:39:05
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
std::ifstream fin("plantatie.in");
std::ofstream fout("plantatie.out");

#include <array>
#include <vector>
//#include <fmt/core.h>
#include <limits>

constexpr unsigned NMAX = 505;
constexpr unsigned LMAX = 11;

// using fmt::print;

int main()
{

        unsigned n, m;
        fin >> n >> m;

        std::vector<std::vector<unsigned>> arr(NMAX, std::vector<unsigned>(NMAX, 0));
        for(unsigned i = 1; i <= n; ++i)
        {
                for(unsigned j = 1; j <= n; ++j)
                {
                        fin >> arr[i][j];
                }
        }

        std::vector<unsigned> log2(NMAX, 0);
        log2[1] = 0;
        for(unsigned i = 2; i <= n; ++i)
        {
                log2[i] = log2[i / 2] + 1;
        }

        std::vector<std::vector<std::vector<unsigned>>> rmq(
            NMAX, std::vector<std::vector<unsigned>>(LMAX, std::vector<unsigned>(NMAX, 0)));
        for(unsigned i = 1; i <= n; ++i)
        {
                for(unsigned j = 1; j <= n; ++j)
                {
                        rmq[i][0][j] = arr[i][j];
                }
        }

        for(unsigned row = 1; row <= n; ++row)
        {
                for(unsigned i = 1; (1u << i) <= n; ++i)
                {
                        for(unsigned j = 1; j <= n - (1 << i) + 1; ++j)
                        {
                                rmq[row][i][j] = std::max(rmq[row][i - 1][j],
                                                          rmq[row][i - 1][j + (1 << (i - 1))]);
                        }
                }
        }

        for(unsigned i = 0; i < m; ++i)
        {
                unsigned row, a, lat;
                fin >> row >> a >> lat;
                --lat;
                const unsigned b = std::min(n, a + lat);
                // print(stderr, "saerching interval {}, {}\n", a, b);

                unsigned res = 0;

                for(unsigned r = row; r <= std::min(row + lat, n); ++r)
                {
                        const unsigned diff = b - a + 1;
                        const unsigned logdiff = log2[diff];
                        const unsigned nums_left = diff - (1 << logdiff);
                        res = std::max(
                            res, std::max(rmq[r][logdiff][a], rmq[r][logdiff][a + nums_left]));
                }
                fout << res << '\n';
        }
}