Cod sursa(job #1408962)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 30 martie 2015 12:39:29
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define INF 999999999
using namespace std;
FILE* fin=fopen("rmq.in","r");
ofstream fout("rmq.out");

int Arb[ 4 * 100000 + 50 ], limit_s, limit_d, pos, val;
int n, m, i;

int _Minim( int nod , int left , int right )
{
    if ( right < limit_s || left > limit_d )
        return INF;

    if ( right <= limit_d && left >= limit_s )
        return Arb[ nod ];

    int middle = ( left + right ) / 2;
    return min( _Minim( nod * 2 , left , middle ), _Minim( nod * 2 + 1 , middle + 1 , right ) );
}

void _Update( int nod , int left , int right )
{
    if ( left == right )
    {
        Arb[ nod ] = val;
        return;
    }

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

    Arb[ nod ] = min( Arb [ nod * 2 ] , Arb [ nod * 2 + 1 ] );
}

int main()
{
    fscanf(fin,"%d%d",&n,&m);
    for ( i=1 ; i<=n ; i++ )
    {
        pos=i;
        fscanf(fin,"%d",&val);
        _Update( 1 , 1 , n );
    }

    for ( i=1 ; i<=m ; i++ )
    {
        fscanf(fin,"%d%d",&limit_s,&limit_d);
        fout<<_Minim( 1 , 1 , n )<<'\n';
    }

    return 0;
}