Cod sursa(job #2791172)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 30 octombrie 2021 10:37:08
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 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][20]; //maximul din patratul de latura 2^k cu i,j stanga sus
int maxim(int a, int b, int c, int d){return max(max(a,b), max(c,d));}

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;i++)
            for(j=1;j<=n;j++)
                d[i][j][k]=maxim(d[i][j][k-1],d[i+lat][j][k-1],
                                d[i][j+lat][k-1],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=maxim(d[i][j][expn], d[i+k-lat][j][expn],d[i][j+k-lat][expn],d[i+k-lat][j+k-lat][expn]);
        fout<<sol<<"\n";
    }
    return 0;
}