Cod sursa(job #1161060)

Utilizator cbanu96Banu Cristian cbanu96 Data 30 martie 2014 23:18:49
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define FILEIN "rmq.in"
#define FILEOUT "rmq.out"
#define NMAX 262145 // 2^K > 2*N
#define INF 0x3f3f3f3f

int AINT[NMAX];
int N, M, sol;

void update(int node, int l, int r, int pos, int val) {
    if (l == r) {
        AINT[node] = val;
        return;
    }

    int m = (l+r)/2;
    if (pos <= m) update(2*node, l, m, pos, val);
    else update(2*node+1, m+1, r, pos, val);

    if (r == pos) {
        AINT[node] = min(AINT[2*node], AINT[2*node+1]);
    }
}

void query(int node, int l, int r, int x, int y) {
    if (x <= l && r <= y) {
        sol = min(sol, AINT[node]);
        return;
    }

    if (x > r || y < l)
        return;

    int m = (l+r)/2;

    query(2*node, l, m, x, y);
    query(2*node+1, m+1, r, x, y);
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

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

    for ( int i = 1, x, y; i <= M; i++ ) {
        sol = INF;
        scanf("%d %d", &x, &y);
        query(1, 1, N, x, y);

        printf("%d\n", sol);
    }

    return 0;
}