Cod sursa(job #436701)

Utilizator alexandru92alexandru alexandru92 Data 8 aprilie 2010 20:19:24
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
/* 
 * File:   main.cpp
 * Author: VirtualDemon
 *
 * Created on April 8, 2010, 7:58 PM
 */
#include <cstdlib>
#include <fstream>
#include <algorithm>
#define Nmax 400100
#define oo 0x3f3f3f3f

/*
 * 
 */
using namespace std;
int Aint[Nmax];
int P, x, a, b;
inline const int& min( const int& x, const int& y )
{
    if( x < y )
        return x;
    return y;
}
inline void UpDate( int vertex, int left, int right  )
{
    if( left == right )
    {
        Aint[vertex]=x;
        return;
    }
    int middle=left+(right-left)/2, p=vertex<<1, y=oo;
    if( P <= middle )
        UpDate( p, left, middle );
    else UpDate( p+1, middle+1, right );
    Aint[vertex]=min( Aint[p], Aint[p+1] );
}
inline int Query( int vertex, int left, int right )
{
    if( a <= left && right <= b )
        return Aint[vertex];
    int p=vertex<<1, middle=left+(right-left)/2, minim=oo;
    if( a <= middle )
        minim=Query( p, left, middle );
    if( b > middle )
        minim=min( minim, Query( p+1, middle+1, right ) );
    return minim;
}
int main(int argc, char** argv)
{
    int N, M;
    ifstream in( "rmq.in" );
    in>>N>>M;
    fill( Aint, Aint+4*N+1, oo );
    for( P=1; P <= N; ++P )
    {
        in>>x;
        UpDate( 1, 1, N );
    }
    ofstream out( "rmq.out" );
    for( ; M; --M )
    {
        in>>a>>b;
        out<<Query( 1, 1, N )<<'\n';
    }
    return EXIT_SUCCESS;
}