Cod sursa(job #2640118)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 5 august 2020 11:43:53
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstring>

using namespace std;

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

const int DIM = 505;
const int LGMAX = 11;

int n,m,v[DIM][DIM];

int rmq[LGMAX][DIM][DIM],lg[DIM],i,j,lat;

void Read()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            fin>>v[i][j];
}

void RMQ()
{
    lg[1]=0;
    for(int i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            rmq[0][i][j]=v[i][j];
    for(int l=1;(1<<l)<=n;l++)
    {
        for(int i=1;i<=n-(1<<l)+1;i++)
        {
            for(int j=1;j<=n-(1<<l)+1;j++)
            {
                int p=(1<<(l-1));
                rmq[l][i][j]=max(max(rmq[l-1][i][j],rmq[l-1][i+p][j]),max(rmq[l-1][i][j+p],rmq[l-1][i+p][j+p]));
            }
        }
    }
}

void Query()
{
    while(m--)
    {
        fin>>i>>j>>lat;
        int l=lg[lat];
        int p=lat-(1<<l);
        int ans=max(max(rmq[l][i][j],rmq[l][i+p][j]),max(rmq[l][i][j+p],rmq[l][i+p][j+p]));
        fout<<ans<<'\n';
    }
}

int main()
{
    Read();
    RMQ();
    Query();
}