Cod sursa(job #2150681)

Utilizator Andrei17Andrei Pascu Andrei17 Data 3 martie 2018 18:30:14
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#include <vector>
#include <climits>

using namespace std;

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

const int N = 100002;

int n, m, v[N], a[4 * N];

void precalc(int poz, int st, int dr) {
    if (st == dr) {
        a[poz] = v[st];
        return;
    }
    precalc(2 * poz, st, (st + dr) / 2);
    precalc(2 * poz + 1, (st + dr) / 2 + 1, dr);
    a[poz] = min(a[2 * poz], a[2 * poz + 1]);
}

int rmq(int x, int y, int st, int dr, int poz) {
    if (x <= st && y >= dr) return a[poz];
    if (y < st || x > dr) return INT_MAX;

    return min(rmq(x, y, st, (st + dr) / 2, poz * 2), rmq(x, y, (st + dr) / 2 + 1, dr, poz * 2 + 1));
}

int main()
{
    int x, y;
    in >> n >> m;
    for (int i = 1; i <= n; i++) in >> v[i];
    std::fill(a + 1, a + 4 * n + 1, INT_MAX);
    precalc(1, 1, n);

    for (int i = 0; i < m; i++) {
        in >> x >> y;
        out << rmq(x, y, 1, n, 1) << '\n';
    }
    out.close();
}