Cod sursa(job #3330100)

Utilizator RaduCalisovCalisovRadu RaduCalisov Data 17 decembrie 2025 16:29:30
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;

int n,m;
vector<vector<vector<int>>> v;

int main() {
    ifstream cin("plantatie.in");
    ofstream cout("plantatie.out");

    cin>>n>>m;

    vector<int> log;
    vector<int> pow;
    
    log.resize(501);
    log[1] = 0;
    
    for(int i=2;i<=500;i++)
        log[i] = log[i/2] + 1;

    pow.resize(log[n]+1);
    v.resize(n+1,vector<vector<int>>(n+1,vector<int>(log[n]+1)));

    pow[0] = 1; 

    for(int i = 1;i<=log[n];i++)
        pow[i] = pow[i-1] * 2;


    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            cin>>v[i][j][0];
    }

    for(int k=1;k<=log[n];k++){
        for(int i=1;i<=n - pow[k-1];i++){
            for(int j=1;j<=n - pow[k-1];j++){
                int lu = v[i][j][k-1];
                int ru = v[i][j+pow[k-1]][k-1];
                int ld = v[i+pow[k-1]][j][k-1];
                int rd = v[i+pow[k-1]][j+pow[k-1]][k-1];

                v[i][j][k] = max({lu,ru,ld,rd});
            }
        }
    }

    for(int t=1;t<=m;t++){
        int i,j,k;
        cin>>i>>j>>k;

        int interval = log[k];

        int lu = v[i][j][interval]; 
        int ru = v[i][j + k - pow[interval]][interval];
        int ld = v[i + k - pow[interval]][j][interval];
        int rd = v[i + k - pow[interval]][j + k - pow[interval]][interval];

        cout<<max({lu,ru,ld,rd})<<"\n";
    }
}