Cod sursa(job #900320)

Utilizator andreea29Iorga Andreea andreea29 Data 28 februarie 2013 19:05:54
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>

#define Nmax 100001
#define Num 20

using namespace std;

int n, v[Nmax], m[Num][Nmax], t, x, y, log[Nmax], num, lg, r, dif, rez, pas, lin, val, q;

void precalc()
{
    num = 2 ;
    lg = 0 ;
    log[1] = 0 ;
    for(int i = 2; i <= Nmax; ++i )
    {
        if( i == num )
        {
            num *= 2 ;
            ++ lg ;
        }
        log[i] = lg ;
    }
}

int pow(int x, int y)
{
    r = 1 ;
    for(int i = 1; i <= y; ++i )
        r *= x ;
    return r ;
}

int main()
{
    ifstream f("rmq.in");
    ofstream h("rmq.out");
    f >> n >> t;
    for(int i = 1; i <= n; ++i )
    {
        f >> v[i];
        m[1][i] = v[i] ;
    }
    pas = 1 ;
    lin = 2 ;
    while( 1 + pas <= n )
    {
        for(int i = 1; i <= n; ++i )
        {
            if( i + pas > n )
                m[lin][i] = m[lin-1][i] ;
            else
                m[lin][i] = min( m[lin-1][i], m[lin-1][i+pas] ) ;
        }
        pas *= 2 ;
        ++lin ;
    }
    precalc() ;
    for (q = 1; q <= t; ++q)
    {
        f >> x >> y;
        dif = y - x  ;
        val = pow ( 2, log[dif] ) ;
        rez = min( m[ log[dif] + 1 ][x], m[ log[dif] + 1 ][ y - val + 1 ] ) ;
        h << rez << '\n';
    }
    return 0 ;
}