Cod sursa(job #2791165)

Utilizator whitevader28Albu Alexandru whitevader28 Data 30 octombrie 2021 10:23:01
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <cmath>

using namespace std;

#define N_MAX 501
#define LOG_MAX 9

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int Max[N_MAX][N_MAX][LOG_MAX], i, j, k, p, N, M, a[N_MAX][N_MAX], cnt, diff;

int main()
{
    fin>>N>>M;
    for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
        {
            fin>>a[i][j];
            Max[i][j][0]=a[i][j];
        }

    for(k=1; (1<<k)<=N; k++)
        for(i=1; i+(1<<k)-1<=N; i++)
            for(j=1; j+(1<<k)-1<=N; j++)
            {
                int maxi=-1;
                int p=(1<<k-1);
                if(maxi<Max[i][j][k-1])
                    maxi=Max[i][j][k-1];
                if(maxi<Max[i+p][j][k-1])
                    maxi=Max[i+p][j][k-1];
                if(maxi<Max[i][j+p][k-1])
                    maxi=Max[i][j+p][k-1];
                if(maxi<Max[i+p][j+p][k-1])
                    maxi=Max[i+p][j+p][k-1];
                Max[i][j][k]=maxi;
            }

    while(M)
    {
        fin>>i>>j>>k;
        p = log2(k);
        diff = k - (1 << p);
        int maxi=-1;
        if(maxi<Max[i][j][p] )
            maxi=Max[i][j][p];
        if(maxi<Max[i+diff][j][p])
            maxi=Max[i+diff][j][p];
        if(maxi<Max[i][j+diff][p])
            maxi=Max[i][j+diff][p];
        if(maxi<Max[i+diff][j+diff][p])
            maxi=Max[i+diff][j+diff][p];
        fout << maxi << '\n';
        M--;
    }

    return 0;
}