Cod sursa(job #973715)

Utilizator monica11Szekely Monica monica11 Data 15 iulie 2013 12:20:24
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstdio>
using namespace std;
long a[300006],n,m,i,x,A,B;
long min(long x,long y)
{
    if(x<y)
    return x;
    else
    return y;
}
void schimba(long nod,long st,long dr,long poz,long val)
{
    long mij;
    if(st==dr)
        a[nod]=val;
    else
    {
        mij=(st+dr)/2;
        if(poz<=mij)
            schimba(2*nod,st,mij,poz,val);
        else
            schimba(2*nod+1,mij+1,dr,poz,val);
        a[nod]=min(a[2*nod],a[2*nod+1]);
    }
}
void detmin(long nod,long st,long dr,long A,long B)
{
    long mij;
    if(A<=st&&B>=dr)
        x=min(x,a[nod]);
    else
    {
        mij=(st+dr)/2;
        if(A<=mij)
            detmin(2*nod,st,mij,A,B);
            if(mij<B)
            detmin(2*nod+1,mij+1,dr,A,B);
    }
}
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%ld%ld",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%ld",&x);
        schimba(1,1,n,i,x);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%ld%ld",&A,&B);
        x=1000000000;
        detmin(1,1,n,A,B);
        printf("%ld\n",x);
    }
    return 0;
}