Cod sursa(job #3297817)

Utilizator Johnny16Filote Ionut Johnny16 Data 23 mai 2025 20:55:30
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

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

int tabelCautare[501][501][10];
int dimensiuneMatrice;
int numarInterogari;
int matriceOriginala[501][501];

void precalculareMaxime() {
    for (int i = 1; i <= dimensiuneMatrice; i++)
        for (int j = 1; j <= dimensiuneMatrice; j++)
           tabelCautare[i][j][0] = matriceOriginala[i][j];

    for (int k = 1; (1 << k) <= dimensiuneMatrice; k++) {
        for (int i = 1; i + (1 << k) - 1 <= dimensiuneMatrice; i++)
            for (int j = 1; j + (1 << k) - 1 <= dimensiuneMatrice; j++) {
                int pas = 1 << (k - 1);
                tabelCautare[i][j][k] = max(max(tabelCautare[i][j][k - 1], tabelCautare[i][j + pas][k - 1]),
                                            max(tabelCautare[i + pas][j][k - 1], tabelCautare[i + pas][j + pas][k - 1]));
            }
    }
}

int main() {
    int linieStart, coloanaStart, laturaPatrat;
    f >> dimensiuneMatrice >> numarInterogari;

    for (int i = 1; i <= dimensiuneMatrice; i++)
       for (int j = 1; j <= dimensiuneMatrice; j++) {
          f >> matriceOriginala[i][j];
       }

    precalculareMaxime();

    for (int i = 0; i < numarInterogari; i++) {
        f >> linieStart >> coloanaStart >> laturaPatrat;
        int k_log = (int)log2(laturaPatrat);
        int putere2 = 1 << k_log;

        int maxim_patrat = max(max(tabelCautare[linieStart][coloanaStart][k_log], tabelCautare[linieStart][coloanaStart + laturaPatrat - putere2][k_log]),
                               max(tabelCautare[linieStart + laturaPatrat - putere2][coloanaStart][k_log], tabelCautare[linieStart + laturaPatrat - putere2][coloanaStart + laturaPatrat - putere2][k_log]));
        g << maxim_patrat << "\n";
    }

    return 0;
}