Cod sursa(job #2885532)

Utilizator gargantuanRares Oprea gargantuan Data 6 aprilie 2022 10:38:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>

using namespace std;


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

const int NMAX = 3e5+5, LOGMAX = 20;
int rmq[LOGMAX][NMAX];

void init_rmq(int n)
{
    for(int log = 1; log < LOGMAX; log++)
    {
        for(int i = 0; i + (1 << log) <= n; i++)
            rmq[log][i] = min(rmq[log - 1][i], rmq[log - 1][i + (1 << log) / 2]);
    }
}

int get_rmq(int a, int b) // indexat de la 1
{
    int d = b - a + 1;
    int l = 31 - __builtin_clz(d);
    return min(rmq[l][a - 1], rmq[l][b - (1 << l)]);
}

int main()
{
    long long n,i,q;
    cin>>n >> q;
    for(i=1;i<=n;i++)
        cin>>rmq[0][i-1];
    init_rmq(n);
    for(i=1;i<=q;i++)
    {
        int a,b;
        cin >> a >> b;
        cout << get_rmq(a, b) << '\n';
    }
    return 0;
}