Cod sursa(job #3313487)

Utilizator Bogdan_RuscanuRuscanu Stefan Bogdan Bogdan_Ruscanu Data 4 octombrie 2025 19:01:09
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>

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

const int NMAX = 1e5 + 5;
const int LOGMAX = 18;

int sp[LOGMAX][NMAX], lg[NMAX];
// sp[j][i] = min pentru intervalul care incepe la i
// si are lungimea 2 ^ j
int n, q;

void buildRmq() {
    for (int i = 1; i <= n; i++) {
        cin >> sp[0][i];
    }
    for (int i = 2; i <= n; i++) {
        lg[i] = lg[i / 2] + 1;
    }
    for (int j = 1; j < LOGMAX; j++) { // 1 << j este lungimea
        for (int i = 1; (i + (1 << j) - 1) <= n; i++) { // capatul stanga
            sp[j][i] = min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]);
        }
    }
}

int query(int l, int r) {
    int lng = r - l + 1;
    return min(sp[lg[lng]][l], sp[lg[lng]][r - (1 << lg[lng]) + 1]);
}

int main()
{
    cin >> n >> q;
    buildRmq();
    while (q--) {
        int l, r;
        cin >> l >> r;
        cout << query(l, r) << '\n';
    }
    return 0;
}