Cod sursa(job #2973587)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 1 februarie 2023 12:41:47
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin  ("plantatie.in");
ofstream fout ("plantatie.out");

const int MAX_N = 500;
int n, pw2[10], lg2[MAX_N + 5];
int mat[MAX_N + 5][MAX_N + 5], rmq[10][MAX_N + 5][MAX_N + 5];

const int MAX_Q = 75000;
int q, l, r, len;
static inline int query(){
    int ll = l+len-1;
    int rr = r+len-1;
    int lg = lg2[ll-l+1];
    ll -= pw2[lg] - 1;
    rr -= pw2[lg] - 1;
    return max({rmq[lg][l][r], rmq[lg][ll][r], rmq[lg][l][rr], rmq[lg][ll][rr]});
}

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>n>>q;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++){
            fin>>mat[i][j];
            rmq[0][i][j] = mat[i][j];
        }

    lg2[0] = lg2[1] = 0;
    for(int i=2; i<=n; i++)
        lg2[i] = lg2[(i >> 1)] + 1;

    pw2[0] = 1;
    for(int i=1; i<=lg2[n]; i++)
        pw2[i] = (pw2[i-1] << 1);

    for(int lg=1; lg<=lg2[n]; lg++)
        for(int i=1, ii; (ii = i + pw2[lg-1])<=n; i++)
            for(int j=1, jj; (jj = j + pw2[lg-1])<=n; j++)
                rmq[lg][i][j] = max({rmq[lg-1][i][j], rmq[lg-1][ii][j], rmq[lg-1][i][jj], rmq[lg-1][ii][jj]});

    while(q--){
        fin>>l>>r>>len;
        fout<<query()<<"\n";
    }
    return 0;
}
/**
**/