Cod sursa(job #850190)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 8 ianuarie 2013 01:00:36
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
using namespace std;
ifstream f ( "rmq.in" );
ofstream g ( "rmq.out" );
#define LE 100666
int i, n, m, log, rmq[18][LE], x, y, a[LE], lg[LE];
int main()
{
    f >> n >> m;

    for ( i = 1; i <= n; ++i )
    {
        f >> a[i];
        rmq[0][i] = a[i];
    }


    for ( i = 2, lg[1] = 0; i <= n; ++i )
        lg[i] = lg[i/2] + 1;

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

    int dif;

    for ( i = 1; i <= m; ++i )
    {
        f >> x >> y;
        dif = y - x + 1;
        g << min ( rmq[lg[dif]][x], rmq[lg[dif]][y- ( 1<<lg[dif] ) +1] ) << '\n';
    }

    f.close();
    g.close();
    return 0;
}