Cod sursa(job #2583147)

Utilizator NashikAndrei Feodorov Nashik Data 17 martie 2020 20:21:36
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
//#include <iostream>
#include <fstream>
using namespace std;
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");
int v[505][505],rmq[505][505][12],put[20],lg[1500];
int q(int i,int j,int k){
    int e=lg[k],ii=i+k-put[e],jj=j+k-put[e];
    return max(rmq[i][j][e],max(rmq[ii][j][e],max(rmq[i][jj][e],rmq[ii][jj][e])));
}
int main()
{
    int n,t;
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>v[i][j];
            rmq[i][j][0]=v[i][j];
        }
    }


    put[0]=1;
    for(int i=1;i<=10;i++){
        put[i]=put[i-1]*2;
        lg[put[i]]++;
    }
    for(int i=1;i<=1000;i++){
        lg[i]+=lg[i-1];
    }


    for(int e=1;e<=9;e++){
        for(int i=1;i<=n;i++){
            if(i+put[e]-1>n)
                break;
            for(int j=1;j<=n;j++){
                if(j+put[e]-1>n)
                    break;
                rmq[i][j][e]=max(rmq[i][j][e-1],max(rmq[i+put[e-1]][j][e-1],max(rmq[i][j+put[e-1]][e-1],rmq[i+put[e-1]][j+put[e-1]][e-1])));
            }
        }
    }

    while(t--){
        int i,j,k;
        cin>>i>>j>>k;
        cout<<q(i,j,k)<<"\n";
    }
    return 0;
}