Cod sursa(job #2094531)

Utilizator spankySpanky spanky Data 26 decembrie 2017 02:12:26
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#define INF 2<<29

using namespace std;

int build_rmq_tree(int n, int A[], int T[], int s, int e, int pos) {
    if (s == e) return T[pos] = A[s];
    else {
        int mid = s + (e - s) / 2;
        return T[pos] = min(build_rmq_tree(n, A, T, s, mid, 2 * pos + 1), build_rmq_tree(n, A, T, mid + 1, e, 2 * pos + 2));
    }
}

int query_rmq(int T[], int s, int e, int pos, int l, int r) {
    if ((s < l && e < l) || (s > r && e > r)) return INF;
    else if (s >= l && e <= r) return T[pos];
    else {
        int mid = s + (e - s) / 2;
        return min(query_rmq(T, s, mid, 2 * pos + 1, l, r), query_rmq(T, mid + 1, e, 2 * pos + 2, l, r));
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    int A[n], T[2 * n];
    for (int i=0; i<n; ++i) {
        cin >> A[i];
    }
    build_rmq_tree(n, A, T, 0, n - 1, 0);
    int l, r;
    for (int i=0; i<m; ++i) {
        cin >> l >> r;
        cout << query_rmq(T, 0, n - 1, 0, l - 1, r - 1) << "\n";
    }
}