Cod sursa(job #832666)

Utilizator ionutz_cnnbIonutz cnnb ionutz_cnnb Data 11 decembrie 2012 01:26:58
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#define M (1<<17)
#define oo 200000
int A[2*M+1], nr[M];
int minim (int x, int y)
{
    return x<=y?x:y;
}
void update (int nod, int st, int dr, int a, int b)
{
    int mij;
    if (a<=st && dr<=b)
        A[nod]=nr[a];
    else
    {
        mij=(st+dr)/2;
        if (a<=mij) update (2*nod, st, mij, a, b);
        if (mij+1<=b) update(2*nod+1, mij+1,dr, a, b);
        A[nod]=minim(A[2*nod], A[2*nod+1]);
    }
}
int query (int nod, int st, int dr, int a, int b)
{
    int mij, m1=oo, m2=oo;
    if (a<=st && dr<=b)
        return A[nod];
    else
    {
        mij=(st+dr)/2;
        if (a<=mij )m1=query(2*nod, st, mij, a, b);
        if (mij+1<=b) m2=query (2*nod+1, mij+1, dr, a, b);
        return minim (m1, m2);
    }
}
int main()
{
    int n,m,i,j;
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d %d",&n, &m);
    for(i=1;i<=n;i++)
        scanf("%d", &nr[i]);
    for(i=n+1;i<=16;i++) nr[i]=oo;
    for(i=1;i<=n;i++)
        update (1,1,n,i,i);
    while (m--)
    {
        scanf("%d %d",&i,&j);
        printf("%d\n",query(1,1,n,i,j));
    }
return 0;
}