Cod sursa(job #3148333)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 31 august 2023 05:30:05
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

static constexpr int NMAX = ((int)(1e5) + 1);
static constexpr int LOGMAX = 17;

int n, m;

int rmq[LOGMAX][NMAX];
int Log[NMAX];

static inline void read()
{
    f.tie(nullptr);

    f >> n >> m;

    for (int i = 1; i <= n; ++i)
    {
        f >> rmq[0][i];

        if (i > 1)
            Log[i] = 1 + Log[(i >> 1)];
    }

    return;
}

static inline int my_min(const int &a, const int &b)
{
    return ((a < b) ? a : b);
}

static inline int query(int l, int r)
{
    int k = Log[(r - l + 1)];

    return my_min(rmq[k][l], rmq[k][(r - (1 << k) + 1)]);
}

static inline void solve()
{
    for (int i = 1; i <= m; ++i)
    {
        int l = 0, r = 0;
        f >> l >> r;

        g << query(l, r) << '\n';
    }

    return;
}

int main()
{
    read();

    for (int i = 1; i <= Log[n]; ++i)
    {
        int length = (1 << i);

        for (int j = 1; j <= (n - length + 1); ++j)
            rmq[i][j] = my_min(rmq[i - 1][j], rmq[i - 1][(j + (length >> 1))]);
    }

    solve();

    return 0;
}