Cod sursa(job #3288939)

Utilizator Manolea_Teodor_StefanManolea Teodor Stefan Manolea_Teodor_Stefan Data 24 martie 2025 20:35:56
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")

//#define fin cin
//#define fout cout

using namespace std;
using ll = long long;
using dbl = double;

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

const int nmax = 501;
int n,q;
int rmq[nmax][nmax][30];
int exponent[nmax];


int main() {
    for (int i = 2; i <= nmax; i++) {
        exponent[i] = 1 + exponent[i / 2];
    }

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

    for (int p = 1; (1 << p) <= n; p++) {
        for (int i1 = 1; i1 <= n; i1++) {
            const int len = (1 << (p - 1));
            int i2 = min(n,i1 + len);
            for (int j1 = 1; j1 <= n; j1++) {
                int j2 = min(n,j1 + len);
                rmq[i1][j1][p] = max({rmq[i1][j1][p-1],rmq[i1][j2][p-1],
                                      rmq[i2][j1][p-1],rmq[i2][j2][p-1]});
            }
        }
    }

    while (q--) {
        int l,r,len;
        fin >> l >> r >> len;
        const int e = exponent[len];
        const int p = (1 << e);
        int i1 = l,
            i2 = l + len - p,
            j1 = r,
            j2 = r + len - p;
        i2 = min(i2,n);
        j2 = min(j2,n);
        fout << max({rmq[i1][j1][e],rmq[i1][j2][e],
                     rmq[i2][j1][e],rmq[i2][j2][e]}) << '\n';
    }
    return 0;
}