Cod sursa(job #3124250)

Utilizator Steven23XHuma Stefan-Dorian Steven23X Data 27 aprilie 2023 15:13:32
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <cmath>

std::ifstream f("plantatie.in");
std::ofstream g("plantatie.out");

int n, rmq[10][501][501], m;

int main()
{

    int n = 0, m = 0, p = 1, k = 0, x, y, l, ans;
    f >> n >> m;
    // Citire matrice
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            f >> rmq[0][i][j];

    std::cout<<rmq[0][4][4];
    // Determinare adancime
    while (p <= n)
    {
        p *= 2;
        k++;
    }

    k--;
    p = 1;

    // Creare Sparse Table

    for (int x = 1; x <= k; x++)
    {
        for (int i = 1; i <= n - p * 2 + 1; i++)
            for (int j = 1; j <= n - p * 2 + 1; j++)
                rmq[x][i][j] = std::max(rmq[x - 1][i][j], std::max(rmq[x - 1][i + p][j + p], std::max(rmq[x - 1][i + p][j], rmq[x - 1][i][j + p])));
        p *= 2;
    }

    // raspundere la queries
    for (int i = 1; i <= m; i++)
    {
        f >> x >> y >> l;
        p = 1;
        k = 0;

        while (p <= l)
        {
            p *= 2;
            k++;
        }
        k--;
        p /= 2;

        ans = std::max(rmq[k][x][y], std::max(rmq[k][x + l - p][y + l - p], std::max(rmq[k][x + l - p][y], rmq[k][x][y + l - p])));
        g << ans << '\n';
    }

    return 0;
}