Cod sursa(job #2094534)

Utilizator spankySpanky spanky Data 26 decembrie 2017 02:25:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 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() {
    FILE *f_in = fopen("rmq.in", "r");
    FILE *f_out = fopen("rmq.out", "w");
    int n, m;
    fscanf(f_in, "%d %d", &n, &m);
    int A[n], T[2 * n];
    for (int i=0; i<n; ++i) {
        fscanf(f_in, "%d", &A[i]);
    }
    build_rmq_tree(n, A, T, 0, n - 1, 0);
    int l, r;
    for (int i=0; i<m; ++i) {
        fscanf(f_in, "%d %d", &l, &r);
        fprintf(f_out, "%d\n", query_rmq(T, 0, n - 1, 0, l - 1, r - 1));
    }
}