Cod sursa(job #2732850)

Utilizator beingsebiPopa Sebastian beingsebi Data 29 martie 2021 14:22:12
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb

#include <bits/stdc++.h>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
vector<vector<vector<int>>> v;
int n, m;
int main()
{
    f >> n >> m;
    v.resize(1 + log2(n));
    v[0].resize(n, vector<int>(n));
    for (auto &i : v[0])
        for (auto &j : i)
            f >> j;
    for (int k = 1; k < (int)v.size(); ++k)
    {
        int dim = (1 << k), bd = (1 << (k - 1)), req = n - dim + 1;
        v[k].resize(req, vector<int>(req));
        for (int i = 0; i < req; ++i)
            for (int j = 0; j < req; ++j)
                v[k][i][j] = max(max(v[k - 1][i][j], v[k - 1][i][j + bd]), max(v[k - 1][i + bd][j], v[k - 1][i + bd][j + bd]));
    }
    for (int x, y, k; m; m--)
    {
        f >> x >> y >> k;
        int ax = log2(k);
        --x;
        --y;
        if (__builtin_popcount(k) == 1)
            g << v[ax][x][y] << '\n';
        else
            g << max(max(v[ax][x][y], v[ax][x][y + k - (1 << ax)]), max(v[ax][x + k - (1 << ax)][y], v[ax][x + k - (1 << ax)][y + k - (1 << ax)])) << '\n';
    }
    return 0;
}