Cod sursa(job #3311303)

Utilizator vlad7654vladimir manescu vlad7654 Data 21 septembrie 2025 08:39:46
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
vector<vector<int> > v;
const int LOGMAX=10;
struct rmq{
    vector<vector<vector<int> > > mat;
    vector<int> lg;
    rmq(vector<vector<int> >& v,int n)
    :mat(LOGMAX+2, vector<vector<int> >(n+1,vector<int>(n+1))), lg(n+1)
    {
        build_log(n);
        build_rmq(v,n);
    }
    void build_log(int n){
        lg[1]=0;
        for(int i=2;i<=n;i++){
            lg[i]=lg[i/2]+1;
        }
    }
    void build_rmq(vector<vector<int> >& v, int n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                mat[0][i][j]=v[i][j];
            }
        }
        for(int k=1;k<=lg[n];k++){
            for(int i=1;i+(1<<k)-1<=n;i++){
                for(int j=1;j+(1<<k)-1<=n;j++){
                    mat[k][i][j]=max(max(mat[k-1][i][j],mat[k-1][i][j+(1<<(k-1))]),max(mat[k-1][i+(1<<(k-1))][j],mat[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
                }
            }
        }
    }
    int query(int i, int j, int k){
        int dist=lg[k];
        //cout<<mat[dist][i][j]<<' '<<mat[dist][i][j+(1<<(dist))]<<' '<<i+(1<<(dist))<<' '<<j;
        return max(max(mat[dist][i][j],mat[dist][i][j+k-(1<<(dist))]),max(mat[dist][i+k-(1<<(dist))][j],mat[dist][i+k-(1<<(dist))][j+k-(1<<(dist))]));
    }
};
int main(){
    int n, q;
    fin>>n>>q;
    v.resize(n+1);
    for(int i=1;i<=n;i++){
        v[i].resize(n+1);
        for(int j=1;j<=n;j++){
            fin>>v[i][j];
        }
    }
    rmq ans(v, n);
    for(int i=1;i<=q;i++){
        int x, y, k;
        fin>>x>>y>>k;
        fout<<ans.query(x, y, k)<<'\n';
    }

}