Cod sursa(job #2891671)

Utilizator CharacterMeCharacter Me CharacterMe Data 19 aprilie 2022 14:47:44
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
std::ifstream fin("plantatie.in");
std::ofstream fout("plantatie.out");

int main() {
    int n, m;
    fin >> n >> m;

    std::vector<std::vector<int>> map(n, std::vector<int>(n));
    for (auto& i:map) {
        for (auto& j:i) {
            fin >> j;
        }
    }

    std::vector<std::vector<std::vector<int>>> rmq(int(log2(2 * n)), std::vector<std::vector<int>>(n, std::vector<int>(n)));

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            rmq[0][i][j] = map[i][j];
        }
    }

    int sz = int(rmq.size());
    for (int k = 1; k < sz; ++k) {
        int pass = (1 << (k - 1));
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                rmq[k][i][j] = rmq[k - 1][i][j];
                if (i + pass < n) {
                    rmq[k][i][j] = std::max(rmq[k][i][j], rmq[k - 1][i + pass][j]);
                    if (j + pass < n) {
                        rmq[k][i][j] = std::max(rmq[k][i][j], rmq[k - 1][i + pass][j + pass]);
                    }
                }

                if (j + pass < n) {
                    rmq[k][i][j] = std::max(rmq[k][i][j], rmq[k - 1][i][j + pass]);
                }
            }
        }
    }

    while (m--) {
        int i, j, l;
        fin >> i >> j >> l;
        --i; --j;

        int lg2 = int(log2(l));
        int pass = (1 << lg2);
        fout << std::max(rmq[lg2][i][j], std::max(rmq[lg2][i + l - pass][j], std::max(rmq[lg2][i][j + l - pass], rmq[lg2][i + l - pass][j + l - pass]))) << "\n";
    }

    return 0;
}