Cod sursa(job #2755195)

Utilizator cosminradu1760Cosmin-Andrei Radu cosminradu1760 Data 26 mai 2021 21:06:38
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include<bits/stdc++.h>

using namespace std;

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


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


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



void initializare()
{
    //RMQ 3D
    int i, j, p, l;     //p = 2^l
      for(l = 1, p = 2; p <= n; ++l, p *= 2)  //nu are sens sa calculeazaulam pt patrate  mai mari decat l plantatie
        for(i = 0; i < n; ++i)
            for(j = 0; j < n; ++j)
                a[l][i][j] = maxim(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]);
                //impartim in 4 patratele si facem maximmul dintre ele

}

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


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

    //sarim peste o bucata de interval(matrice) fiind maximul de intervale prin care se pot intrepatrunde matricele

    return maxim(a[l][x][y], a[l][x][y + lg - pow],a[l][x + lg - pow][y], a[l][x + lg - pow][y + lg - pow]);     //4 subpatrate cu latura de 2^l



}

int main()
{
     int x, y, i, j, k, lg;
    fin >> n >> m;
     for(i = 0; i < 20; ++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 maximmul

   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 << calculeaza(x-1, y-1, lg) << "\n";///indexare de la 0
    }

}