Cod sursa(job #3170666)

Utilizator LitaAndreiLita Andrei Rares LitaAndrei Data 17 noiembrie 2023 23:21:46
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;
// , << >> .
ifstream f("plantatie.in");
ofstream g("plantatie.out");

const int NMAX = 505;
const int LOG = 9;

int rmaxq[NMAX][NMAX][LOG];

int n;

int q, is, js, lat;

inline int maxim(int a, int b)
{
    return (a > b ? a : b);
}

void precompute()
{
    for(int k = 1; k < LOG; k++)
        for(int i = 1; i + (1 << k) - 1 <= n; i++)
            for(int j = 1; j + (1 << k) - 1 <= n; j++)
            {
                rmaxq[i][j][k] = maxim(rmaxq[i][j][k - 1],
                                       maxim(rmaxq[i + (1 << (k - 1))][j][k - 1],
                                             maxim(rmaxq[i][j + (1 << (k - 1))][k - 1],
                                                   rmaxq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1])));
            }
}

int Query(int is, int js, int lat)
{
    int k = 31 - __builtin_clz(lat);
    return (maxim(
                 maxim(rmaxq[is][js][k], rmaxq[is + lat - (1 << k)][js][k]),
                 maxim(rmaxq[is][js + lat - (1 << k)][k], rmaxq[is + lat - (1 << k)][js + lat - (1 << k)][k])
                 ));
}

int main()
{
    f >> n >> q;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            f >> rmaxq[i][j][0];
    precompute();
    for(int i = 1; i <= q; i++)
    {
        f >> is >> js >> lat;
        g << Query(is, js, lat) << '\n';
    }
}