Cod sursa(job #893989)

Utilizator sebii_cSebastian Claici sebii_c Data 26 februarie 2013 19:05:35
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
// O(logn) query using Segment Trees

#include <cstdio>

#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 100001;
const int MAXT = 2 * MAXN + 2;

int tree[MAXT];

void update(int node, int l, int r, int x, int y, int val)
{
    if (l == r) {
        tree[node] = val;
    } else {
        int mid = (l + r) / 2;
        if (x <= mid)
            update(2 * node, l, mid, x, y, val);
        if (y > mid)
            update(2 * node + 1, mid + 1, r, x, y, val);

        tree[node] = min(tree[2 * node], tree[2 * node + 1]);
    }
}

int query(int node, int l, int r, int x, int y)
{
    if (l == r) {
        return tree[node];
    } else {
        int mid = (l + r) / 2;
        int res = INF;
        if (x <= mid)
            res = min(res, query(2 * node, l, mid, x, y));
        if (y > mid)
            res = min(res, query(2 * node + 1, mid + 1, r, x, y));

        return res;
    }
}

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

    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        int x;
        scanf("%d", &x);
        update(1, 1, n, i, i, x);
    }
    for (int i = 0; i < m; ++i) {
        int x, y;
        scanf("%d %d", &x, &y);
        printf("%d\n", query(1, 1, n, x, y));
    }

    return 0;
}