Cod sursa(job #2754097)

Utilizator SofeiAndreiSofei Andrei SofeiAndrei Data 25 mai 2021 01:45:20
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
int n,m,I,putere_2,a,b,l,Max,poz;
int rmq[9][501][501];//9 linii deoarece log2(500)<9 adica avem posibilitatea de a impartii in 9 puteri ale lui 2 ( 2^0 - 2^8 );
using namespace std;
int main ()
{
    f>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            f>>rmq[0][i][j];
        }
    }
    I=0;
    putere_2=2;
    while(putere_2<=n){
        I++;
        for(int i=1;i<=n-putere_2/2;i++){
            for(int j=1;j<=n-putere_2/2;j++){
                rmq[I][i][j]=max(rmq[I-1][i][j],max(rmq[I-1][i+putere_2/2][j],max(rmq[I-1][i][j+putere_2/2],rmq[I-1][i+putere_2/2][j+putere_2/2])));
            }
        }
        for(int i=n-putere_2/2+1;i<=n;i++){
            for(int j=n-putere_2/2+1;j<=n;j++){
                rmq[I][i][j]=rmq[I-1][i][j];
            }
        }
        putere_2=putere_2*2;
    }
    for(int i=1;i<=m;i++){
        f>>a>>b>>l;
        putere_2=1;
        I=0;
        while(putere_2*2<=l){
            putere_2=putere_2*2;
            I++;
        }
        Max=rmq[I][a][b];
        l=l-putere_2;
        poz=putere_2+1;
        while(l>0){
            putere_2=1;
            I=0;
            while(putere_2*2<=l){
                putere_2=putere_2*2;
                I++;
            }
            for(int p=a;p<=a+poz-1;p=p+putere_2){
                Max=max(Max,rmq[I][p][b+poz-1]);
            }
            for(int j=b;j<=b+poz-1;j=j+putere_2){
                Max=max(Max,rmq[I][a+poz-1][j]);
            }
            l=l-putere_2;
            poz=poz+putere_2;
        }
        g<<Max<<'\n';
    }
    /*
    cout<<endl;
    for(int I=0;I<=3;I++){
        cout<<"Patrate de marimea 2 la puterea "<<I<<endl;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cout<<rmq[I][i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl<<endl;
    }
    */
    return 0;
}