Cod sursa(job #2903748)

Utilizator fredtuxFlorin Dinu fredtux Data 17 mai 2022 20:17:49
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;

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

unsigned int arb[500001];

inline unsigned int
arbQry(unsigned int n, unsigned int st, unsigned int dr, unsigned int x, unsigned int y) {
    unsigned int st2, dr2, mid;

    if (st >= x && dr <= y)
        return arb[n];

    st2 = 1000001;
    dr2 = 1000001;

    mid = st + (dr - st) / 2;

    if (x <= mid) {
        st2 = arbQry(2 * n, st, mid, x, y);
    }

    if (y > mid) {
        dr2 = arbQry(2 * n + 1, mid + 1, dr, x, y);
    }

    return min(dr2, st2);
}

inline void arbUpd(unsigned int n, unsigned int st, unsigned int dr, unsigned int p, unsigned int val) {
    if (st == dr) {
        arb[n] = val;
        return;
    }

    unsigned int mid = st + (dr - st) / 2;
    if (p <= mid) {
        arbUpd(2 * n, st, mid, p, val);
    } else {
        arbUpd(2 * n + 1, mid + 1, dr, p, val);
    }

    arb[n] = min(arb[2 * n], arb[2 * n + 1]);
}

int main() {
    unsigned int n, m, i, x, y;

    fin >> n >> m;

    for (i = 0; i < n; ) {
        fin >> x;
        arbUpd(1, 1, n, ++i, x);
    }

    for (i = 0; i < m; ++i) {
        fin >> x >> y;
        fout << arbQry(1, 1, n, x, y) << endl;
    }

    return 0;
}