Cod sursa(job #3302293)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 5 iulie 2025 20:54:41
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 510;
const int LOG = 10;

int mat[NMAX][NMAX], rmq[NMAX][NMAX][LOG];

int squares4(int i, int j, int k)
{
    int a, b, c, d;
    a = rmq[i][j][k - 1];
    b = rmq[i + (1 << (k - 1))][j][k - 1];
    c = rmq[i][j + (1 << (k - 1))][k - 1];
    d = rmq[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1];

    return max(a, max(b, max(c, d)));
}
int query(int i_query, int j_query, int k_query)
{
    int log_query = log2(k_query);
    int a, b, c, d;
    a = rmq[i_query][j_query][log_query];
    b = rmq[i_query + k_query - (1 << log_query)][j_query][log_query];
    c = rmq[i_query + k_query - (1 << log_query)][j_query + k_query - (1 << log_query)][log_query];
    d = rmq[i_query][j_query + k_query - (1 << log_query)][log_query];
    return max(a, max(b, max(c, d)));
}
int main()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    int n, q;
    scanf("%d %d", &n, &q);

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            scanf("%d", &mat[i][j]);
            rmq[i][j][0] = mat[i][j];
        }
    int maxLog = log2(n) + 1;
    for (int k = 1; k < maxLog; ++k)
        for (int i = 1; i + (1 << k) - 1 <= n; ++i)
            for (int j = 1; j + (1 << k) - 1 <= n; ++j)
            {
                rmq[i][j][k] = squares4(i, j, k);
            }
    while (q--)
    {
        int lin, col, lat;
        scanf("%d %d %d", &lin, &col, &lat);
        printf("%d\n", query(lin, col, lat));
    }
    return 0;
}