Cod sursa(job #2749364)

Utilizator ionut31Ioan Ionescu ionut31 Data 6 mai 2021 15:20:29
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.11 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int N, M, Log2[505],m[10][505][505];

//subprogram care calculeaza log2 din toate numerele de la 1 la N
void logaritm()
{
    //Log2[0] = Log2[1] = 0;
    for (int i = 2; i <= N; ++i)
        Log2[i] = Log2[i/2] + 1;
}

//subprogram care returneaza maximul dintre 4 elemente
int maxim(int a, int b, int c, int d)
{
    int m1, m2;
    if(a > b)
        m1 = a;
    else
        m1 = b;

    if(c > d)
        m2 = c;
    else
        m2 = d;

    if(m1 > m2)
        return m1;
    else
        return m2;
}

//subprogram pentru generarea matricei tridimensionale ce contine pe fiecare nivel i
//maximele pe suprafete patrate de latura 2^i din matricea de numere data
void sol()
{
    for (int k=1; k <= Log2[N]; ++k)
        for (int i=1; i + (1<<(k-1)) <= N; ++i)
            for (int j=1; j + (1<<(k-1)) <= N; ++j)
            {
               int x = 1 << (k-1);
                m[k][i][j] = maxim( m[k-1][i][j], m[k-1][i][j+x], m[k-1][i+x][j], m[k-1][i+x][j+x] );
                //completam fiecare pozitie, din matricele de pe fiecare nivel, din matricea tridimensionala m,
                //cu valoarea maxima dintre cele 4 subpatrate ale patratului actual(de latura 2^k si care are coltul stanga sus
                // in coordonatele i si j)
            }
}


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

    //completam prima linie a matricei tridimensionale(linia 0) cu matricea data
    // (minimele pe suprafete de forma a[i][j])
    for (int i=1; i<=N; ++i)
        for (int j=1; j<=N; ++j)
            fin >> m[0][i][j];

    //construim matricea tridimensionala m ce retine maximele me suprafete patratice
    sol();

    //interogam
    for (int i=1; i <= M; ++i)
    {
        //citim coordonatele(x = linia/coordonata pe Oy si y = coloana/coordonata pe Ox) coltului
        // din stanga sus ale patratului ce urmeaza sa fie interogat
        //si dimensiunea laturii acestuia(l)
        int x, y, l, z;
        fin >> x >> y >> l;

        //z primeste valoarea log2 din lungimea laturii patratului citit (ne pozitionam pe nivelul
        //potrivita in matricea tridimensionala m)
        z = Log2[l];

        //afisam cea mai mare valoare dintre maximele celor 4 subpatrate
        //ale patratului actual(de latura l si cu coltul stanga sus in coorodnatele x si y),
        //patrate ce sunt incluse in patratul actual si il acopera in intregime

        int ydr = y+l; //coordonata y a coltului din stanga sus al urmatorului patrat(mai la dreapta pe axa Ox cu l fata de coltul patratului actual),
                      // din care vom scadea 2^z ca sa nu iesim din suprafata
        int xjos = x+l; //coordonata x a coltului din stanga sus al urmatorului patrat(mai jos pe axa Oy cu l fata de coltul patratului actual),
                       // din care vom scadea 2^z ca sa nu iesim din suprafata

        fout << maxim (m[z][x][y], m[z][x][ydr - (1 << z)], m[z][xjos - (1 << z)][y], m[z][xjos - (1 << z)][ydr - (1 << z)]) << "\n";
    }
    return 0;
}