Cod sursa(job #2886798)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 8 aprilie 2022 12:50:49
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>

using namespace std;

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

const int max_size = 5e2 + 1, max_exp = 11;

int a[max_size][max_size], rmq[max_exp][max_size][max_size], lg[max_size];

int main ()
{
    int n, t;
    in >> n >> t;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            in >> a[i][j];
            rmq[0][i][j] = a[i][j];
        }
    }
    lg[1] = 0;
    for (int i = 2; i <= n; i++)
    {
        lg[i] = lg[i / 2] + 1;
    }
    for (int e = 1; (1 << e) <= n; e++)
    {
        int p = (1 << (e - 1));
        for (int i = p + 1; i <= n; i++)
        {
            for (int j = p + 1; j <= n; j++)
            {
                rmq[e][i][j] = max(rmq[e - 1][i - p][j - p], max(rmq[e - 1][i - p][j], max(rmq[e - 1][i][j - p], rmq[e - 1][i][j])));
            }
        }
    }
    while (t--)
    {
        int l, c, lat;
        in >> l >> c >> lat;
        int e = lg[lat];
        int p = (1 << e);
        int i = l + lat - 1, j = c + lat - 1;
        out << max(rmq[e][i - lat + p][j - lat + p], max(rmq[e][i - lat + p][j], max(rmq[e][i][j - lat + p], rmq[e][i][j]))) << '\n';
    }
    in.close();
    out.close();
    return 0;
}