Cod sursa(job #1740466)

Utilizator AplayLazar Laurentiu Aplay Data 11 august 2016 16:54:45
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

#define minn(a,b) a < b ? a : b

#define NMAX 100001
#define INF 1 << 30

using namespace std;

int N, M, x, y, range[4 * NMAX];

void update(int node, int left, int right, int a, int b, int value) {
    if (left == right) {
        range[node] = value;
        return;
    } else {
        int middle = left + (right - left) / 2;
        if (a <= middle) {
            update (2 * node + 1, left, middle, a, b, value);
        }
        if (middle < b) {
            update(2 * node + 2, middle + 1, right, a, b, value);
        }
        range[node] = minn(range[2 * node + 1], range[2 * node + 2]);
    }
}

int read(int node, int left, int right, int a, int b) {
    int first = INF, second = INF;

    if (a <= left && right <= b) {
        return range[node];
    } else {
        int middle = left + (right - left) / 2;
        if (a <= middle) {
            first = read(2 * node + 1, left, middle, a, b);
        }
        if (middle < b) {
            second = read(2 * node + 2, middle + 1, right, a, b);
        }
        return minn(first, second);
    }
}

int main() {
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    scanf("%d%d", &N, &M);
    for (int it = 0; it < N; ++it) {
        scanf("%d", &x);
        update(0, 0, N - 1, it, it, x);
    }

    for (int it = 0; it < M; ++it) {
        scanf("%d%d", &x, &y);
        printf("%d\n", read(0, 0, N - 1, x - 1, y - 1));
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}