Cod sursa(job #3004216)

Utilizator pifaDumitru Andrei Denis pifa Data 16 martie 2023 10:39:34
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q;

int rmq[10][505][505];

int lg[505];

int val (int i, int j, int e)
{
    int l = i + e - 1, c = j + e - 1;
    return max(rmq[lg[e]][i][j], max(rmq[lg[e]][i][c - (1 << lg[e]) + 1], max(rmq[lg[e]][l - (1 << lg[e]) + 1][j], rmq[lg[e]][l - (1 << lg[e]) + 1][c - (1 << lg[e]) + 1])));
}

int main()
{
    in >> n >> q;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            in >> rmq[0][i][j];
        }
        if(i == 1)
            continue;
        lg[i] = lg[i / 2] + 1;
    }

    for(int e = 1; (1 << e) <= n; e++)
    {
        for(int i = 1; i + (1 << e) - 1 <= n; i++)
        {
            for(int j = 1; j + (1 << e) - 1 <= n; j++)
            {
                int p = (1 << (e - 1));

                rmq[e][i][j] = max(rmq[e - 1][i + p][j], max(rmq[e - 1][i][j + p], max(rmq[e - 1][i + p][j + p], rmq[e - 1][i][j])));
            }
        }
    }

    while(q--)
    {
        int i, j, k;
        in >> i >> j >> k;
        out << val(i, j, k) << '\n';
    }
    return 0;
}