Cod sursa(job #1370983)

Utilizator BologaDragosBologa Dragos BologaDragos Data 3 martie 2015 18:27:53
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

#define Minim(a,b) (a<b? a:b)

#define NMAX 100004

#define INF 0x3f3f3f3f

using namespace std;

int ArbMin[NMAX*4+69] ;

int m,n,val,pos,minim ;

int start,finish ;

void update(int nod,int left,int right)
{

    if(left==right)
    {
        ArbMin[nod]=val ;
        return ;
    }

    int mij;
    mij=(left+right)/2 ;
    if(pos<=mij)
        update(nod*2,left,mij) ;
    else
        update(nod*2+1,mij+1,right) ;

    ArbMin[nod]=Minim(ArbMin[nod*2],ArbMin[2*nod+1]) ;
}

void query(int nod,int left,int right)
{
    if(start<=left&&right<=finish)
    {
        if(ArbMin[nod]<minim)
            minim=ArbMin[nod] ;
        return ;
    }

    int mij ;
    mij=(left+right)/2 ;

    if(start<=mij)
        query(nod*2,left,mij) ;
    if(mij<finish)
        query(nod*2+1,mij+1,right) ;

}

ifstream f("rmq.in") ;
ofstream g("rmq.out") ;

int main()
{
    int x ;
    f>>n>>m ;
    for(int i=1;i<=n;i++)
    {
        f>>x ;
        pos=i ;
        val=x ;
        update(1,1,n) ;
    }

    for(int i=1;i<=m;i++)
    {
        f>>start>>finish ;
        minim=INF ;
        query(1,1,n) ;
        g<<minim<<'\n' ;

    }


    return 0;
}