Cod sursa(job #3141055)

Utilizator SSKMFSS KMF SSKMF Data 12 iulie 2023 08:12:22
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
using namespace std;

ifstream cin ("plantatie.in");
ofstream cout ("plantatie.out");

int maxim[10][501][501];

int main ()
{
    int lungime , intrebari;
    cin >> lungime >> intrebari;

    for (int linie = 1 ; linie <= lungime ; linie++)
        for (int coloana = 1 ; coloana <= lungime ; coloana++) 
            cin >> maxim[0][linie][coloana];

    for (int exponent = 1 ; (1 << exponent) <= lungime ; exponent++) 
        for (int linie = 1 ; linie + (1 << exponent) - 1 <= lungime ; linie++) 
            for (int coloana = 1 ; coloana + (1 << exponent) - 1 <= lungime ; coloana++) 
                maxim[exponent][linie][coloana] = max(maxim[exponent - 1][linie][coloana] , max(maxim[exponent - 1][linie + (1 << (exponent - 1))][coloana] ,
                max(maxim[exponent - 1][linie][coloana + (1 << (exponent - 1))] , maxim[exponent - 1][linie + (1 << (exponent - 1))][coloana + (1 << (exponent - 1))])));

    auto Adancime = [] (int numar) -> int {
        int adancime = -1;
        for (int bit = 0 ; (1 << bit) <= numar ; bit++)
            adancime++;

        return adancime;
    };

    for (int intrebare = 1 , linie , coloana , lungime_patrat ; intrebare <= intrebari ; intrebare++)
    {
        cin >> linie >> coloana >> lungime_patrat;

        int exponent = Adancime(lungime_patrat);
        cout << max(maxim[exponent][linie][coloana] , max(maxim[exponent][linie + lungime_patrat - (1 << exponent)][coloana] , max(maxim[exponent][linie][coloana + lungime_patrat - (1 << exponent)] , 
                maxim[exponent][linie + lungime_patrat - (1 << exponent)][coloana + lungime_patrat - (1 << exponent)]))) << '\n';
    }

    cout.close(); cin.close();
    return 0;
}