Cod sursa(job #2754108)

Utilizator SofeiAndreiSofei Andrei SofeiAndrei Data 25 mai 2021 02:30:52
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 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,In,putere_2_n;
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];
        }
    }
    In=0;
    putere_2_n=2;
    while(putere_2_n<=n){
        In++;
        for(int i=1;i<=n-putere_2_n/2;i++){
            for(int j=1;j<=n-putere_2_n/2;j++){
                rmq[In][i][j]=max(rmq[In-1][i][j],max(rmq[In-1][i+putere_2_n/2][j],max(rmq[In-1][i][j+putere_2_n/2],rmq[In-1][i+putere_2_n/2][j+putere_2_n/2])));
            }
        }
        putere_2_n=putere_2_n<<1;
    }
    putere_2_n=putere_2_n>>1;
    for(int i=1;i<=m;i++){
        f>>a>>b>>l;
        putere_2=putere_2_n;
        I=In;
        while(putere_2>l){
            putere_2=putere_2>>1;
            I--;
        }
        Max=rmq[I][a][b];
        l=l-putere_2;
        poz=putere_2;
        while(l>0){
            while(putere_2>l){
                putere_2=putere_2>>1;
                I--;
            }
            for(int p=a;p<=a+poz;p=p+putere_2){
                Max=max(Max,rmq[I][p][b+poz]);
            }
            for(int j=b;j<b+poz;j=j+putere_2){
                Max=max(Max,rmq[I][a+poz][j]);
            }
            l=l-putere_2;
            poz=poz+putere_2;
        }
        g<<Max<<'\n';
    }
    return 0;
}