Cod sursa(job #2091833)

Utilizator VladGhetinaVlad Ghetina VladGhetina Data 20 decembrie 2017 12:19:31
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

#define IN "rmq.in"
#define OUT "rmq.out"

int n , m;
int rmq[17][100003] , loga[100003];

void Read()
{
    int i;

    scanf ( "%d%d" , &n , &m );
    for ( i = 1 ; i <= n ; i ++ )
        scanf ( "%d" , &rmq[0][i]);
}

void Log()
{
    int i;
    loga[1] = 0;

    for ( i = 2 ; i <= n ; i ++ )
        loga[i] = loga[i/2]+1;
}


void RMQ()
{
    Log();

    int i , j , t;
    t = loga[n];

    for ( i = 1 ; i <= t ; i ++ )
        for ( j = 1 ; j <= n ; j ++ )
            if ( j+(1<<(i-1)) < n )
            rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);

   /* for ( i = 0 ; i <= t ; i ++ ){
        for ( j = 1 ; j <= n ; j ++ )
           printf ( "%d " , rmq[i][j]);
    printf ("\n");}
    */
}

void Solve()
{
    int i , x , y , d;

    for ( i = 1 ; i <= m ; i ++ ){
        scanf ( "%d%d" , &x , &y );
     d = loga[(x-y+1)];
     printf ( "%d\n" , min(rmq[d][x],rmq[d][y-(1<<d)+1]));
    }
}

int main()
{
   freopen( IN , "r" , stdin );
   freopen( OUT , "w" , stdout );

   Log();
   Read();
   RMQ();
   Solve();
}