Cod sursa(job #3277877)

Utilizator ALEXANDRUspargoaseAlexandru Joita ALEXANDRUspargoase Data 17 februarie 2025 18:43:10
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>

using namespace std;

ifstream cin("plantatie.in");
ofstream cout("plantatie.out");

const int NMAX = 502;
int a[NMAX][NMAX];

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

int max(int a, int b, int c, int d)
{
    return max(max(a, b), max(c, d));
}

struct SparseTable
{
    int n;
    int rmq[20][NMAX][NMAX];

    SparseTable(int n) : n(n)
    {
        int logN = 31 - __builtin_clz(n);

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

        for (int k = 1; k <= logN; k++)
            for (int i = 1; i + (1 << k) - 1 <= n; i++)
                for (int j = 1; j + (1 << k) - 1 <= n; j++)
                {
                    int len1 = i + (1 << (k - 1)), len2 = j + (1 << (k - 1));
                    rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][len1][j], rmq[k - 1][i][len2], rmq[k - 1][len1][len2]);
                }
    }

    int query(int i, int j, int l)
    {
        int k = 31 - __builtin_clz(l);

        int i1 = i + l - 1 - (1 << k) + 1, j1 = j + l - (1 << k);
        return max(rmq[k][i][j], rmq[k][i1][j], rmq[k][i][j1], rmq[k][i1][j1]);
    }
};

int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> a[i][j];

    SparseTable rmq(n);

    while (m--)
    {
        int i, j, l;
        cin >> i >> j >> l;
        cout << rmq.query(i, j, l) << '\n';
    }
    return 0;
}