Cod sursa(job #2752369)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 17 mai 2021 20:05:12
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>

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

//RMQ 2D folosind tablou tridimensional

int n,m;

int val[18][1503][1503];

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

}
void Init()
{
    for(int i=0; i<17; ++i)
        for(int j=0; j<1500; ++j)
            for(int k=0; k<1500; ++k)
                val[i][j][k]=-1; //o valoare foarte mica nu va influenta maximul

}

void Prep()
{
    //val[l][x][y]=maximul din patratul avand coltul stanga sus la coord (x,y) si latura 2^l

    for(int l=1, range=2; range<=n; ++l, range*=2) //range=2^l
        for(int x=0; x<n; ++x)
            for(int y=0; y<n; ++y)
                //sparg patratul mare in 4 patrate mici bazate pe calcule anterioare
                    val[l][x][y]=maxval(val[l-1][x][y], val[l-1][x+range/2][y], val[l-1][x][y+range/2], val[l-1][x+range/2][y+range/2]);

}

int maxQuery(int x, int y,int sz)
{
    int powmax=1, indexpow=0;
    //caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
    while(powmax*2<=sz)
        powmax*=2, indexpow++;

    //sparg patratul mare in 4 patrate mai mici care au colturile in patratul mare
    //matricile se pot intrepatrunde pentru ca fac maximul si nu influenteaza

    return maxval(val[indexpow][x][y], val[indexpow][x][(y+sz)-powmax], val[indexpow][(x+sz)-powmax][y], val[indexpow][(x+sz)-powmax][(y+sz)-powmax]);

}
int main()
{
    int left, right,sz;
    fin>>n>>m;
    Init();
    for(int x=0; x<n; ++x)
        for(int y=0; y<n; ++y)
            fin>>val[0][x][y]; //prima linie e matricea

    Prep(); //preprocesare

    for(int i=1; i<=m; ++i)
    {
        fin>>left>>right>>sz; //capetele intervalului
        fout<<maxQuery(left-1,right-1,sz)<<"\n"; //indexare de la 0 in tabloul meu
    }


    return 0;
}