Cod sursa(job #3366732)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 3 octombrie 2026 19:31:08
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>

std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");

int n, m;
int rmq[18][100005], e[100005], a[100005];

void buildRMQ() {
    e[0] = e[1] = 0;
    for (int i = 2; i <= n; i++) {
        e[i] = e[i / 2] + 1;
    }
    for (int i = 1; i <= n; i++) {
        rmq[0][i] = a[i];
    }
    for (int i = 1; i <= e[n]; i++) {
        for (int j = 1; j <= n - (1 << i) + 1; j++) {
            rmq[i][j] = std::min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
        }
    }
}

int query(int x, int y) {
    int expo, L;
    L = y - x + 1;
    expo = e[L];
    return std::min(rmq[expo][x], rmq[expo][y - (1 << expo) + 1]);
}

int main() {
    int x, y;
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }

    buildRMQ();
    // for (int i = 0; i <= e[n]; i++) {
    //     for (int j = 1; j <= n - (1 << i) + 1; j++) {
    //         std::cout << rmq[i][j] << " ";
    //     }
    //     std::cout << "\n";
    // }
    for (int i = 1; i <= m; i++) {
        fin >> x >> y;
        fout << query(x, y) << "\n";
    }
}