Cod sursa(job #3234241)

Utilizator MR0L3eXMaracine Constantin Razvan MR0L3eX Data 8 iunie 2024 12:40:04
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include "bits/stdc++.h"

using i64 = long long;

std::vector<std::vector<std::vector<int>>> rmq;

int query(int x, int y, int w) {
    int x1 = x + w - 1, y1 = y + w - 1;
    int lg = std::log2(w);
    int p = (1 << lg);
    int res = rmq[lg][x][y];

    res = std::max(res, rmq[lg][x1 - p + 1][y]);

    res = std::max(res, rmq[lg][x][y1 - p + 1]);

    res = std::max(res, rmq[lg][x1 - p + 1][y1 - p + 1]);

    return res;
}

void build_rmq(int n) {
    for (int pw2 = 1; (1 << pw2) <= n; ++pw2) {
        for (int i = 1; i <= n - (1 << pw2) + 1; ++i) {
            for (int j = 1; j <= n - (1 << pw2) + 1; ++j) {
                rmq[pw2][i][j] = std::max(rmq[pw2 - 1][i][j], rmq[pw2 - 1][i + (1 << (pw2 - 1))][j]);

                rmq[pw2][i][j] = std::max(rmq[pw2][i][j], rmq[pw2 - 1][i][j + (1 << (pw2 - 1))]);

                rmq[pw2][i][j] = std::max(rmq[pw2][i][j], rmq[pw2 - 1][i + (1 << (pw2 - 1))][j + (1 << (pw2 - 1))]);
            }
        }
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    int n, m;
    std::cin >> n >> m;
    rmq = std::vector<std::vector<std::vector<int>>>
          (10, std::vector<std::vector<int>>
           (n + 1, std::vector<int>(n + 1)));

    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            std::cin >> rmq[0][i][j];
        }
    }

    build_rmq(n);

    for (int i = 0; i < m; i++) {
        int x, y, w;
        std::cin >> x >> y >> w;
        std::cout << query(x, y, w) << std::endl;
    }
    return 0;
}