Cod sursa(job #874669)

Utilizator razvan.popaPopa Razvan razvan.popa Data 9 februarie 2013 10:01:48
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>
#include<algorithm>
#define INF (1<<30)
#define FOR(i,a,b)\
   for(int i=a; i<=b; ++i)
#define infile "rmq.in"
#define outfile "rmq.out"
#define mn(x, y) (v[x] < v[y]) ? x : y
#define nMax 100005
using namespace std;

int v[nMax];

int AI[4 * nMax];

int N, M;

void init(int nod, int st, int dr){
    if(st == dr){
       AI[nod] = st;
       return;
    }

    int m = (st + dr)/2;

    if(st <= m)
       init(2*nod, st, m);
    if(m < dr)
       init(2*nod+1, m+1, dr);

    AI[nod] = mn(AI[2*nod], AI[2*nod+1]);
}


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

    int r1 = 0, r2 = 0, m = (st + dr)/2;

    if(a <= m)
       r1 = query(2*nod, st, m, a, b);

    if(m < b)
       r2 = query(2*nod+1, m+1, dr, a, b);

    return mn(r1, r2);
}

void update(int nod, int st, int dr, int pos){
    if(st == dr){
        AI[nod] = pos;
        return;
    }

    int m = (st + dr)/2;

    if(pos <= m)
       update(2*nod, st, m, pos);
    else
       update(2*nod+1, m+1, dr, pos);

    AI[nod] = mn(AI[2*nod], AI[2*nod+1]);
}


int main(){
    freopen(infile, "r", stdin);
    freopen(outfile,"w",stdout);

    scanf("%d %d", &N, &M);

    v[0] =  INF;

    FOR(i,1,N){
        scanf("%d", &v[i]);
        //update(1, 1, N, i);
    }

    init(1,1,N);

    int x, y;
    while(M--){
        scanf("%d %d", &x, &y);

        printf("%d\n", v[query(1,1,N,x,y)]);
    }

    fclose(stdout);
    fclose(stdout);

    return 0;
}