Cod sursa(job #2906207)

Utilizator maria-marianita.cucos@s.unibuc.roCucos Marianita [email protected] Data 25 mai 2022 09:00:28
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
#define NMAX 501

int rmq[11][NMAX][NMAX], logg2[NMAX], N, M;

int maxx(int a, int b, int c, int d) //calculeaza maxx ul dintre cele 4 numere
{
    a = max(a, b);
    c = max(c, d);
    return max(a, c);
}

void logaritm() //aceasta functie calculeaza logaritmii in baza 2
{
    for (int i = 2; i <= N; ++i)
        logg2[i] = logg2[i / 2] + 1;
}

//formam matricea pentru laturile puteri ale lui 2.
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] = maxx(rmq[k - 1][i][j], //nord vest
                                    rmq[k - 1][i + (1 << (k - 1))][j], //sud
                                    rmq[k - 1][i][j + (1 << (k - 1))], //est
                                    rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]); // sud est pe diagonala
}

void query(int a, int b, int k) {
    int len = logg2[k];
    fout << maxx(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);
    }
}