Cod sursa(job #2753720)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 24 mai 2021 09:33:12
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb

#include<bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");



int n, m;
int a[18][503][503]; ///a[l][i][j] --> maximul unui patrat cu coltul stanga sus in x, y si cu o latura de 2^l


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

///RMQ 3D

void initializare()
{
    int i, j, p, l;                            ///2^l = p
      for(l = 1, p = 2; p <= n; ++l, p *= 2)///p <= n --> nu are rost sa calculam pt patrate care sunt mai mari decat l plantatie
        for(i = 0; i < n; ++i)
            for(j = 0; j < n; ++j)
                a[l][i][j] = maxi(a[l-1][i][j], a[l-1][i][j + p/2],a[l-1][i + p/2][j], a[l-1][i + p/2][j + p/2]);
                ///spargem patratul in 4 patratele --> facem maximul dintre ele

}

int calc(int x, int y, int lg)
{

    ///cautam cea mai mare putere a lui 2 apropiata de lg
    int pow = 1, l = 0;
    while(pow*2 < lg)
        {
            pow *= 2;
            l++;    ///exponentul puterii de 2
        }

    ///acum stim ca putem sa sarim: peste o bucata de interval(matrice)
    ///fiind maxim de intervale se pot intrepatrunde matricele

    return maxi(a[l][x][y], a[l][x][y + lg - pow],a[l][x + lg - pow][y], a[l][x + lg - pow][y + lg - pow]);     ///tot de cele 4 matrici ---> cu latura de 2^l



}

int main()
{
     int x, y, i, j, k, lg;
    fin >> n >> m;
    ///initializam matriea de max
     for(i = 0; i < 17; ++i)
        for(j = 0; j < 500; ++j)
            for(k = 0; k < 500; ++k)
                a[i][j][k] = -1; //o valoare foarte mica nu va influenta maximul

   for( i = 0; i < n; ++i)
        for(j = 0; j < n; ++j)
            fin >> a[0][i][j]; //prima linie e matricea

    initializare();

    for( i = 1; i <= m; ++i)
    {
        fin >> x >> y >> lg;
        fout << calc(x-1, y-1, lg) << "\n";///indexare de la 0
    }

}