Cod sursa(job #3299529)

Utilizator sergioneUngureanu Sergiu sergione Data 7 iunie 2025 19:28:00
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <climits>
#define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int LOG = 20;

int main() {
    int n, q;
    cin >> n >> q;
    vector<vector<int>> up(n + 1, vector<int>(LOG, 0));
    vector<int> llog(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> up[i][0];
    }

    auto preprocess = [&]() -> void {
        llog[1] = 0;
        for (int i = 2; i <= n; i++) {
            llog[i] = llog[i / 2] + 1;
        }

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

    preprocess();

    auto query = [&](int a, int b) -> int {
        int len = b - a + 1;
        int k = llog[len];
        return min(up[a][k], up[b - (1 << k) + 1][k]);
    };

    while (q--) {
        int a, b;
        cin >> a >> b;
        cout << query(a, b) << '\n';
    }
    return 0;
}