Cod sursa(job #1210575)

Utilizator mariusn01Marius Nicoli mariusn01 Data 20 iulie 2014 15:06:29
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define DIM 100010

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int A[4*DIM];
int n, m, i, a, b, x;

inline int minim(int a, int b) {
    return ( a<b ? a : b );
}

void update(int nod, int st, int dr, int p, int x) {
    if (st == dr) {
        A[nod] = x;
        return;
    }

    int mid = (st + dr)/2;
    if (p <= mid)
        update(2*nod, st, mid, p, x);
    if (p>=mid+1)
        update(2*nod+1, mid+1, dr, p, x);
    A[nod] = minim(A[2*nod], A[2*nod+1]);
}

int query(int nod, int st, int dr, int a, int b) {
    if (a <= st && dr <= b)
        return A[nod];

    int mid = (st + dr)/2;
    int qst = DIM, qdr = DIM;
    if (a <= mid) {
        qst = query(2*nod, st, mid, a, b);
    }
    if (b >= mid + 1) {
        qdr = query(2*nod+1, mid+1, dr, a, b);
    }

    return minim(qst, qdr);
}

int main() {
    fin>>n>>m;

    for (i=1;i<=n;i++) {
        fin>>x;
        update(1, 1, n, i, x);
    }


    for (i=1;i<=m;i++) {
        fin>>a>>b;
        fout<<query(1, 1, n, a, b)<<"\n";
    }

    return 0;
}