Pagini recente » Cod sursa (job #1336243) | Cod sursa (job #2961758) | Cod sursa (job #474375) | Borderou de evaluare (job #1567496) | Cod sursa (job #2753894)
#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';
}
}