Cod sursa(job #2864229)

Utilizator Madalin_IonutFocsa Ionut-Madalin Madalin_Ionut Data 7 martie 2022 18:23:37
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, N;
int a[250003], rmq[21][250003], p2[250003];
queue<int> q;

void RMQ()
{
    int i, j, len;
    p2[1] = 0;
    for (i = 2; i <= N; i++)
        p2[i] = 1 + p2[i / 2];
    for (i = 1; i <= N; i++)
        rmq[0][i] = i;
    for (i = 1; (1 << i) <= N; i++)
        for (j = 1; j <= N - (1 << i) + 1; j++)
        {
            len = (1 << (i - 1));
            rmq[i][j] = rmq[i - 1][j];
            if (a[rmq[i - 1][j]] < a[rmq[i - 1][j + len]])
                rmq[i][j] = rmq[i - 1][j + len];
        }
}

void Citire()
{
    int i, x, y, k, poz1, poz2, sol1, sol2, len, expo, maxim;
    fin >> n >> m;
    N = n * n;
    for (i = 1; i <= N; i++)
        fin >> a[i];
    RMQ();
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y >> k;
        for (int i = 1; i <= k; i++)
        {
            poz1 = (x - 1) * n + y;
            poz2 = (x - 1) * n + y + k - 1;
            expo = p2[poz2 - poz1 + 1];
            len = (1 << expo);
            sol1 = rmq[expo][poz1];
            sol2 = rmq[expo][poz2 - len + 1];
            if (a[sol1] > a[sol2])
                q.push(a[sol1]);
            else q.push(a[sol2]);
            x++;
        }
        maxim = 0;
        while (!q.empty())
        {
            maxim = max(maxim, q.front());
            q.pop();
        }
        fout << maxim << "\n";
    }
}

int main()
{
    Citire();
    fout.close();
    return 0;
}