Cod sursa(job #3159162)

Utilizator misu_LIXulescu Vasile misu_L Data 20 octombrie 2023 20:24:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.77 kb
/// rmq
#include <fstream>

using namespace std;

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

int n, y, q, a[100002], rmq[100002][20], lg;

void build() {
    for (int j = 1; j <= lg; 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 lgth = r-l+1;
    lgth = a[lgth];
    return min(rmq[l][lgth], rmq[r - (1<<lgth) + 1][lgth]);
}

int main()
{
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        if (i != 1)
            a[i] = a[i/2]+1;
        cin >> rmq[i][0];
    }

    lg = a[n];
    build();

    while (q--) {
        int x, y;
        cin >> x >> y;
        cout << query(x, y) << endl;
    }

    return 0;
}