Cod sursa(job #2847068)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 10 februarie 2022 10:06:01
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#define boostIO ios_base::sync_with_stdio(false); fin.tie(nullptr); fout.tie(nullptr);
#pragma GCC optimize ("Ofast")
#include <bits/stdc++.h>

using namespace std;

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

const int MAX_N = 505;

int lg2[MAX_N];
int rmq[MAX_N][MAX_N][9][9];
int n;
int q, x, y, l;

int query(int i, int j, int ii, int jj){
    int pi = lg2[ii - i];
    int pj = lg2[jj - j];
    ii -=  (1<<pi) - 1;
    jj -=  (1<<pj) - 1;
    return max({
        rmq[i][j][pi][pj],
        rmq[i][jj][pi][pj],
        rmq[ii][j][pi][pj],
        rmq[ii][jj][pi][pj]
    });
}

int main (){
    boostIO

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

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


    for(int pi=0; (1<<pi)<=n; pi++)
        for(int pj=0; (1<<pj)<=n; pj++)
            if(pi || pj)
                for(int ii, i=1; (ii = i + (1<<pi)-1) <= n; i++)
                    for(int jj, j=1; (jj = j + (1<<pj)-1) <= n; j++)
                        rmq[i][j][pi][pj] = query(i, j, ii, jj);

    while(q--){
        fin>>x>>y>>l;
        fout<<query(x, y, x+l-1, y+l-1)<<"\n";
    }
    return 0;
}