Cod sursa(job #2773226)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 5 septembrie 2021 18:10:04
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("plantatie.in");
ofstream g ("plantatie.out");

constexpr int NMAX = 501;
constexpr int LGMAX = 11;

int N, M;
int RMQ[LGMAX][NMAX][NMAX];
int Log[NMAX];

void Read () {
    f >> N >> M;

    for (int i = 1; i <= N; ++ i )
        for (int j = 1; j <= N; ++ j )
            f >> RMQ[0][i][j];
}

void Do_RMQ () {
    for (int lg = 2; lg <= N; ++ lg )
        Log[lg] = Log[lg/2] + 1;

    for (int lg = 1; lg <= Log[N]; ++ lg )
        for (int i = 1; i <= N - (1<<lg) + 1; ++ i )
            for (int j = 1; j <= N - (1<<lg) + 1; ++ j )
                RMQ[lg][i][j] = max(max(RMQ[lg-1][i][j], RMQ[lg-1][i+(1<<(lg-1))][j+(1<<(lg-1))]),
                                    max(RMQ[lg-1][i+(1<<(lg-1))][j], RMQ[lg-1][i][j+(1<<(lg-1))]));
}

int Query (int i, int j, int k) {
    int L = Log[k];

    int IMax = i + k - 1, JMax = j + k - 1;

    return max(max(RMQ[L][i][j], RMQ[L][IMax-(1<<L)+1][JMax-(1<<L)+1]),
               max(RMQ[L][IMax-(1<<L)+1][j], RMQ[L][i][JMax-(1<<L)+1]));
}

void Solve () {
    for (; M; -- M ) {
        int i, j, k;
        f >> i >> j >> k;

        g << Query(i, j, k) << '\n';
    }
}

int main () {
    Read();
    Do_RMQ();
    Solve();

    return 0;
}