Cod sursa(job #2790944)

Utilizator AndreiP25Prusacov Andrei AndreiP25 Data 29 octombrie 2021 20:19:46
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

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

long long int rmax[500][500][9], i,j,k,N,M,plantatie[500][500],lg[500], cnt;

void create_table()
{
    for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
            rmax[i][j][0]=plantatie[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;
                if(maxi<rmax[i][j][k-1])
                    maxi=rmax[i][j][k-1];
                if(maxi<rmax[i+(1<<k-1)][j][k-1])
                    maxi=rmax[i+(1<<k-1)][j][k-1];
                if(maxi<rmax[i][j+(1<<k-1)][k-1])
                    maxi=rmax[i][j+(1<<k-1)][k-1];
                if(maxi<rmax[i+(1<<k-1)][j+(1<<k-1)][k-1])
                    maxi=rmax[i+(1<<k-1)][j+(1<<k-1)][k-1];
                rmax[i][j][k]=maxi;
            }
}

int cauta(int i, int j, int k)
{
    int p = lg[k], dif;
    dif = k - (1 << p);
    int maxi=-1;
    if(rmax[i][j][p] > maxi)
        maxi=rmax[i][j][p];
    if(rmax[i+dif][j][p]>maxi)
        maxi=rmax[i+dif][j][p];
    if(rmax[i][j+dif][p]>maxi)
        maxi=rmax[i][j+dif][p];
    if(rmax[i+dif][j+dif][p]>maxi)
        maxi=rmax[i+dif][j+dif][p];
    return maxi;
}

int main()
{
    fin>>N>>M;
    for(i=1; i<=N;i++)
        for(j=1; j<=N; j++)
            fin>>plantatie[i][j];

    create_table();
    lg[1]=0;
    for (i=2;i<=N;i++)
        lg[i]=lg[i/2]+1;

    for(cnt=1; cnt<=M; cnt++)
    {
        fin>>i>>j>>k;
        fout<<cauta(i,j,k)<<'\n';
    }

    return 0;
}