Cod sursa(job #1954713)

Utilizator darian2001Clodnischi Darian Antonio darian2001 Data 5 aprilie 2017 16:33:21
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>

using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int n,teste;
int rmq[10][500][500];
int log[501];

void citire()
{
    f>>n>>teste;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            f>>rmq[0][i][j];
}

void precalculare()
{
    log[1]=0;
    int S1,S2,S3,S4;
    for(int i=2;i<=500;i++)
        log[i]=log[i/2]+1;
    for(int nivel=1;(1<<nivel)<=n;nivel++)
        for(int i=1;i<=n-(1<<nivel)+1;i++)
            for(int j=1;j<=n-(1<<nivel)+1;j++)
            {
                S1=rmq[nivel-1][i][j];
                S2=rmq[nivel-1][i][j+(1<<(nivel-1))];
                S3=rmq[nivel-1][i+(1<<(nivel-1))][j];
                S4=rmq[nivel-1][i+(1<<(nivel-1))][j+(1<<(nivel-1))];
                rmq[nivel][i][j]=max(S1,max(S2,max(S3,S4)));
            }

}

void testare()
{
    int i,j,k,nivel,diff;
    for(int test=1;test<=teste;test++)
    {
        f>>i>>j>>k;
        nivel=log[k];
        diff=k-(1<<nivel);
        g<<max(max(max(rmq[nivel][i][j],rmq[nivel][i+diff][j]),rmq[nivel][i][j+diff]),rmq[nivel][i+diff][j+diff])<<"\n";
    }
}
int main()
{
    citire();
    precalculare();
    testare();
    f.close();
    g.close();
}