Cod sursa(job #2791141)

Utilizator whitevader28Albu Alexandru whitevader28 Data 30 octombrie 2021 09:58:21
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <cmath>

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

#define N_MAX 501
#define LOG 9

int a[N_MAX][N_MAX];
int Max[N_MAX][LOG][N_MAX];

int main()
{
    int N, M, i, j, k, maxi, p, ant;
    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(int k=1; (1<<k)<=N; k++)
        for(i=1; i+(1<<k)-1<=N; i++)
            for(j=1; j+(1<<k)-1<=N; j++)
            {
                maxi=-1;
                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);
        ant=k-(1<<p);
        maxi=-1;
        if(maxi<Max[i][j][p])
            maxi=maxi<Max[i][j][p];
        if(maxi<Max[i+ant][j][p])
            maxi=Max[i+ant][j][p];
        if(maxi<Max[i][j+ant][p])
            maxi=Max[i][j+ant][p];
        if(maxi<Max[i+ant][j+ant][p])
            maxi=Max[i+ant][j+ant][p];
        fout << maxi << '\n';
        M--;
    }
    fin.close();
    fout.close();
    return 0;
}