Cod sursa(job #713113)

Utilizator mytzuskyMihai Morcov mytzusky Data 14 martie 2012 11:30:35
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <stdio.h>

#define oo 0x3f3f3f3f
#define nn 400005

using namespace std;

int n,m, arb[nn], minn;

void update(int poz, int val, int nod, int st, int dr)
{
    if(st==dr)
        arb[nod] = val;
    else
    {
        int mij = (st+dr)/2;

        if(poz <= mij)     update(poz,val, 2*nod,   st,    mij);
        else               update(poz,val, 2*nod+1, mij+1, dr );

        arb[nod] = min(arb[2*nod], arb[2*nod+1]);
    }
}

void search(int X, int Y, int nod, int st, int dr)
{
    if(X <= st && dr <= Y)
        minn = min(minn, arb[nod]);
    else
    {
        int mij=(st+dr)/2;

        if( X <= mij )   search(X,Y, 2*nod,   st,    mij);
        if( mij < Y )    search(X,Y, 2*nod+1, mij+1, dr );
    }
}


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

    int x,y,a;

    scanf("%d %d", &n, &m);
    for(int i=1;i<=n;++i)
        scanf("%d", &a),
        update(i,a,1,1,n);

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

    return 0;
}