Cod sursa(job #2481438)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 26 octombrie 2019 21:42:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <algorithm>
const int NMAX = 100000;
const int LMAX = 18;
int RMQ[LMAX + 1][NMAX + 1];
int V[NMAX + 1];
int lg[NMAX + 1];
int main()
{
    freopen("rmq.in" , "r" , stdin);
    freopen("rmq.out" , "w" , stdout);
    int n , No_Of_Queries , l;
    scanf("%d%d" , &n ,&No_Of_Queries);
    for(register int i = 1; i <= n ; i ++)
    {
        scanf("%d" , &V[i]);
        RMQ[0][i] = V[i];
    }
    /// Precalculez Log2(i)
    lg[1] = 0;
    lg[1] = 0;
    for(register int i = 2; i <= n ; i ++)
    {
        lg[i] = lg[i / 2] + 1;
    }

    /// Generez matricea RMQ
    for(register int i = 1; (1 << i) <= n ; i ++)
    {
        for(register int j = 1; j <= n - (1 << i) + 1 ; j ++)
        {
            l = 1 << (i - 1);
            RMQ[ i ][ j ] = std :: min( RMQ[ i - 1][ j ] , RMQ[ i - 1][ j + l]);
        }
    }

    /// Raspund la intrebari
    for(register int Query = 1 ; Query <= No_Of_Queries ; Query ++ )
    {
        int x , y;
        scanf("%d%d" , &x , &y);
        int dif = y - x + 1;
        l = lg[dif];
        int sh = dif - (1 << l);
        printf("%d\n" , std :: min(RMQ[ l ][ x ] , RMQ[ l ][ x + sh]));

    }
return 0;
}