Cod sursa(job #2985029)

Utilizator rastervcrastervc rastervc Data 25 februarie 2023 15:36:25
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

constexpr int LIM = 505;
constexpr int LG = 10;

int N, M, i, j, k, q, mat[LIM][LIM];
int RMQ[LG][LIM][LIM], lg2[LIM];

static inline void prepare_RMQ() {
    lg2[1] = 0;
    for (i = 2; i <= N; ++i)
        lg2[i] = lg2[i / 2] + 1;
    
    for (i = 1; i <= N; ++i)
        for (j = 1; j <= N; ++j) {
            RMQ[0][i][j] = mat[i][j];
            for (k = 1; (1 << k) <= min(i, j); ++k) {
                const int len = (1 << (k - 1));
                const int ans1 = max(RMQ[k - 1][i][j], RMQ[k - 1][i - len][j - len]);
                const int ans2 = max(RMQ[k - 1][i - len][j], RMQ[k - 1][i][j - len]);
                RMQ[k][i][j] = max(ans1, ans2);
            }
        }
}

static inline int query_RMQ(int x, int y, int len) {
    const int lg_len = lg2[len];
    const int offset = len - (1 << lg_len);

    const int ans1 = max(RMQ[lg_len][x][y], RMQ[lg_len][x - offset][y - offset]);
    const int ans2 = max(RMQ[lg_len][x - offset][y], RMQ[lg_len][x][y - offset]);
    return max(ans1, ans2);
}

int main() {
    fin >> N >> M;
    for (i = 1; i <= N; ++i)
        for (j = 1; j <= N; ++j)
            fin >> mat[i][j];

    prepare_RMQ();

    for (q = 1; q <= M; ++q) {
        fin >> i >> j >> k;
        fout << query_RMQ(i + k - 1, j + k - 1, k) << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}