Cod sursa(job #2278252)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 7 noiembrie 2018 15:43:53
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

const int N=500+5;
const int LOG=10;

int n,t;
int rmq[N][N][LOG];
int lg2[N];

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    cin>>n>>t;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>rmq[i][j][0];
        }
    }
    for(int i=0;i<N;i++)
    {
        lg2[i]=(int)(log2(i));
    }
    for(int lg=1;(1<<lg)<=n;lg++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                /// build rmq[i][j][lg]
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i][j][lg-1]);
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i][j+(1<<(lg-1))][lg-1]);
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i+(1<<(lg-1))][j][lg-1]);
                rmq[i][j][lg]=max(rmq[i][j][lg],rmq[i+(1<<(lg-1))][j+(1<<(lg-1))][lg-1]);
            }
        }
    }
    for(int tc=1;tc<=t;tc++)
    {
        int r,c,len;
        cin>>r>>c>>len;
        int re=r+len-1;
        int ce=c+len-1;
        int lg=lg2[len];
        int ans=0;
        ans=max(ans,rmq[r][c][lg]);
        ans=max(ans,rmq[r][ce-(1<<lg)+1][lg]);
        ans=max(ans,rmq[re-(1<<lg)+1][c][lg]);
        ans=max(ans,rmq[re-(1<<lg)+1][ce-(1<<lg)+1][lg]);
        cout<<ans<<"\n";
    }
    return 0;
}