Cod sursa(job #2864291)

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

using namespace std;

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

int n, m;
int rmq[10][503][503], p2[503];

/**p2[i] = lungimea putere a lui 2 maxima a unui interval care
are lungimea i
rmq[i][j] = pozitia minimului din intervalul[j, j + 2 ^ i - 1]
i = 0, 1, ...k, unde 2 ^ k <= p
*/

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

void Citire()
{
    int i, j, x, y, k, len, expo;
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            fin >> rmq[0][i][j];
    RMQ();
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y >> k;
        expo = p2[k];
        len = (1 << expo);
        fout << max({ rmq[expo][x][y], rmq[expo][x + k - len][y], rmq[expo][x][y + k - len], rmq[expo][x + k - len][y + k - len] }) << "\n";
    }
}

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