Cod sursa(job #186364)

Utilizator andrei_infoMirestean Andrei andrei_info Data 27 aprilie 2008 19:42:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>

using namespace std;

inline int min ( int &a, int &b)
{
    return a < b ? a : b;
}

#define MAX 100005
#define LGMAX 18

int rmq[LGMAX][MAX], lg[MAX], N,M;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

void precalc()
{
    lg[1] = 0;
    for (int i = 2; i<=N; i++)
        lg[i] = lg[i/2] + 1;
    for ( int stp = 1; stp <= lg[N]; stp++)
        for (int i = 1; i<=N; i++)
            rmq[stp][i] = min( rmq[stp-1][i], rmq[stp-1][i + (1<<(stp-1))]);
}

int main()
{
    fin>>N>>M;
    for ( int i = 1; i<=N; i++)
        fin>>rmq[0][i];
    precalc();

    for ( ; M>0; M--)
    {
        int a,b;
        fin>>a>>b;
        fout<<min ( rmq[lg[b-a+1]][a], rmq[lg[b-a+1]][b- ( 1<<lg[b-a+1])+1])<<"\n";
    }

    return 0;
}