Cod sursa(job #420050)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 18 martie 2010 13:19:32
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>
#define IN "rmq.in"
#define OUT "rmq.out"
#define Lg 20
#define MIN(a,b) a<b?a:b

using namespace std;

int rmq[Lg][1<<Lg];
int Put[1<<Lg];
int N,M,P1,P2;

void Read()
{
    scanf ("%d %d",&N,&M);
    for (int i=1 ; i<=N ; i++)
        scanf ("%d", &rmq[0][i]);
}

void Solve()
{
    for (int i=2; i<=N; i++)
        Put[i] = Put[i>>1]+1;

    for (int i=1; i<=Put[N]; i++)
    {
        P1 = (1<<i)-1;
        P2 = (1<<(i-1));
        for (int j=1; j<=N-P1; j++)
            rmq[i][j] = MIN(rmq[i-1][j], rmq[i-1][j+P2]);
    }
}

void Write()
{
    int A,B,D;
    for (int i=0; i<M; i++)
    {
        scanf ("%d %d", &A, &B);
        D = Put[B-A+1];
        printf("%d\n", MIN(rmq[D][A], rmq[D][B-(1<<D)+1]));
    }
}

int main ()
{
    freopen (IN ,"r", stdin);
    freopen (OUT, "w", stdout);
    Read();
    Solve();
    Write();
    return 0;
}