Cod sursa(job #2791192)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 30 octombrie 2021 10:48:01
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#define K 510
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n,i,j,x,y,k,q,sol,lg[K];//exp celei mai apropiate puteri de 2 <=i
int d[K][K][11]; //maximul din patratul de latura 2^k cu i,j stanga sus
int main(){
    fin>>n>>q;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            fin>>d[i][j][0];
    for(k=1;(1<<k)<=n;k++){
        int lat=(1<<(k-1));
        for(i=1;i<=n-(1<<k)+1;i++)
            for(j=1;j<=n-(1<<k)+1;j++){
                d[i][j][k]=max(d[i][j][k-1],d[i+lat][j][k-1]);
                d[i][j][k]=max(d[i][j][k], d[i][j+lat][k-1]);
                d[i][j][k]=max(d[i][j][k], d[i+lat][j+lat][k-1]);
            }
    }//impart patratul de latura 2^k in 4 patrate de lat 2^(k-1)

    for(i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;
    for(;q--;){
        fin>>i>>j>>k;
        int expn=lg[k];
        int lat=(1<<expn);
        // patratul de lat k e acoperit de 4 patrate de lat 2^expn
        sol=max(d[i][j][expn], d[i+k-lat][j][expn]);
        sol=max(sol, d[i][j+k-lat][expn]);
        sol=max(sol, d[i+k-lat][j+k-lat][expn]);
        fout<<sol<<"\n";
    }
    return 0;
}