Cod sursa(job #2432908)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 25 iunie 2019 13:56:13
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;
const int nmax=505;
int l[nmax],v[nmax][nmax],rmq[20][nmax][nmax],lg[nmax],a,b,k,n,m;
void buildrmq()
{
    lg[1]=0;
    for(int i=2; i<=n; i++)
        lg[i]=lg[i>>1]+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; l<=lg[n]; l++)
    {
        for(int i=1; i<=n-(1<<l)+1; i++)
            for(int j=1;j<=n-(1<<l)+1;j++)
                rmq[l][i][j]=max(rmq[l-1][i][j],max(rmq[l-1][i+(1<<(l-1))][j],max(rmq[l-1][i][j+(1<<(l-1))],rmq[l-1][i+(1<<(l-1))][j+(1<<(l-1))])));
    }
}
int answerrmq(int x,int y,int k)
{
    return max(rmq[lg[k]][x][y],max(rmq[lg[k]][x+k-(1<<(lg[k]))][y],max(rmq[lg[k]][x][y+k-(1<<(lg[k]))],rmq[lg[k]][x+k-(1<<(lg[k]))][y+k-(1<<(lg[k]))])));
}
int main()
{
    ifstream cin("plantatie.in");
    ofstream cout("plantatie.out");
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>v[i][j];
    buildrmq();
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>k;
        cout<<answerrmq(a,b,k)<<"\n";
    }
    return 0;
}