Cod sursa(job #2891665)

Utilizator CharacterMeCharacter Me CharacterMe Data 19 aprilie 2022 14:39:14
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 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<int> > rmq(int(log2(2 * n)), std::vector<int>(n * n));

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

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

                if (j + pass < n) {
                    rmq[k][pos] = std::max(rmq[k][pos], rmq[k - 1][pos + 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 * n + j], std::max(rmq[lg2][(i + l - pass) * n + j], std::max(rmq[lg2][i * n + (j + l - pass)], rmq[lg2][(i + l - pass) * n + (j + l - pass)]))) << "\n";
    }

    return 0;
}