Cod sursa(job #577866)

Utilizator raica_cristiraica dumitru cristian raica_cristi Data 10 aprilie 2011 18:18:55
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<stdio.h>
#include<vector>
#include<string.h>
#include<ctype.h>

using namespace std;

#define dim 100100
#define INF 0x3f3f3f
int v[dim*4] ,n,m,x,MAX;
void afis ()
{
    for(int i=1 ; i<=4*n ; i++ )
    if ( v[i]>32142134)
    printf("0 ");
    else
    printf("%d ",v[i] ) ;
}
int MIN ( int x, int y )
{
    if ( y<=x )
    return y;

    return x;
}
void update ( int nod , int st , int dr , int poz , int x  )
{

    if ( st == dr )
    {
        v[ nod ] = x ;
     //   printf("%d %d\n",nod , x ) ;
        //printf("%d ", x);
        return ;
    }
    int mij = (st+dr)>>1 ;
    if ( mij >= poz )
     update ( nod*2, st , mij , poz ,x) ;
    else
    update( nod*2+1 ,mij+1 , dr , poz ,x );
  v[ nod ] = MIN ( v[ nod * 2 ] , v[ nod*2+1 ] );



}
void query ( int nod , int st , int dr ,int a ,int b )
{
    if ( a <= st && b>=dr )
    {
       // printf(" %d %d %d\n",a,b,v[nod] ) ;
       if ( v[nod]<MAX )
       MAX = v[nod] ;
        return ;
    }
    int mij = (st + dr) >> 1 ;
    if ( mij >= a )
        query (nod*2 ,st , mij , a,b  );
    if ( mij < b )
        query ( nod*2+1 , mij+1 , dr , a ,b ) ;

}
void read()
{
    scanf("%d %d",&n,&m);
    for(int i=1 ; i<=n;i++)
    {
        scanf("%d",&x);
        update( 1 ,1 ,n ,i ,x ) ;
    }
  //  afis(); printf("\n");
 int a,b;
    for(int i=1 ; i<=m;i++)
    {
        MAX = INF;
        scanf("%d %d",&a,&b);
        query ( 1,1,n ,a ,b );
        printf("%d\n",MAX ) ;
    }
}

int main ()
{

    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    memset ( v , INF , sizeof ( v ) ) ;
    read();
    //solve();
    return 0;
}