Cod sursa(job #2738746)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 6 aprilie 2021 12:17:57
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>

using namespace std;

const int N = 500;
const int LOG = 9;

int v[N + 1][N + 1], r[LOG][N + 1][N + 1], log2[N + 1];

inline int max(int a, int b, int c, int d) {
    return max(max(a, b), max(c, d));
}

int main() {
    ifstream in("plantatie.in");
    ofstream out("plantatie.out");
    int n, q;
    in >> n >> q;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            in >> v[i][j];
    for (int l = 1; l <= n; ++l)
        for (int c = 1; c <= n; ++c) {
            r[0][l][c] = v[l][c];
            int i = 1, p2 = 2;
            while (p2 <= min(l, c)) {
                r[i][l][c] = max(r[i - 1][l][c], r[i - 1][l - p2 / 2][c], r[i - 1][l][c - p2 / 2], r[i - 1][l - p2 / 2][c - p2 / 2]);
                ++i, p2 *= 2;
            }
        }
    for (int i = 2; i <= n; ++i)
        log2[i] = log2[i / 2] + 1;
    int x, y, k;
    while (q--) {
        in >> x >> y >> k;
        x += k - 1;
        y += k - 1;
        int lg = log2[k], p2 = (1 << lg);
        out << max(r[lg][x][y], r[lg][x - k + p2][y], r[lg][x][y - k + p2], r[lg][x - k + p2][y - k + p2]) << '\n';
    }
    in.close();
    out.close();
    return 0;
}