Cod sursa(job #2754549)

Utilizator ChelaruPaulChelaru Paul ChelaruPaul Data 25 mai 2021 23:40:02
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>

using namespace std;
#define NMAX 501
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int rmq[11][NMAX][NMAX], Log2[NMAX], N, M;

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

void logaritm() {
    //calculez log2 din numerele de la 1 la n
    for (int i = 2; i <= N; ++i)
        Log2[i] = Log2[i / 2] + 1;
}

//vom calcula matricea A dar doar pentru laturi puteri ale lui 2.
// A[i][j][k] va fi elementul de valoare maxima dintr-un patrat cu coltul stanga-sus pe linia i si coloana j si latura 2ˆk
void proces() {
    for (int k = 1; (1 << k) <= N; ++k)
        for (int i = 1; i + (1 << k) - 1 <= N; ++i)
            for (int j = 1; j + (1 << k) - 1 <= N; ++j)
                rmq[k][i][j] = max(rmq[k - 1][i][j], //stanga sus
                                   rmq[k - 1][i + (1 << (k - 1))][j], //jos
                                   rmq[k - 1][i][j + (1 << (k - 1))], //dreapta
                                   rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]); // dreapta jos pe diagonala
}                                        //lng interv

//Pentru o raspunde la o intrebare i j k in O(1) vom determina cea mai mare
// putere p a lui 2 astfel incat 2ˆp ≤ k, si vom lua maximul din 4 patrate cu
// colturile in patratul din intrebare si latura 2ˆp.
void query(int a, int b, int k) {
    int len = Log2[k];
    fout << max(rmq[len][a][b],
                rmq[len][a][b + k - (1 << len)],
                rmq[len][a + k - (1 << len)][b],
                rmq[len][a + k - (1 << len)][b + k - (1 << len)]) << '\n';
}

int main() {
    fin >> N >> M;

    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            fin >> rmq[0][i][j];

    logaritm();
    proces();

    int a, b, k;
    for (int q = 1; q <= M; ++q) {
        fin >> a >> b >> k;
        query(a, b, k);
    }
}