Cod sursa(job #2827488)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 5 ianuarie 2022 19:53:54
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 1e5;
const int LOG_N = 18;

int n, q;
int rmq[N + 5][LOG_N], log[N + 5];

void precompute()
{
    for(int i = 2; i <= n; i++)
        log[i] = log[i / 2] + 1;

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

int query(int l, int r)
{
    int dist = r - l + 1;
    return min(rmq[l][log[dist]], rmq[r - (1 << log[dist]) + 1][log[dist]]);
}

int main()
{
    //ios_base::sync_with_stdio(false);
    //cin.tie(NULL);

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

    precompute();

    while(q--)
    {
        int x, y;
        in >> x >> y;
        out << query(x, y) << '\n';
    }

    return 0;
}