Cod sursa(job #604498)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 22 iulie 2011 20:40:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>

#define NMax 100005
#define LgMax 20

using namespace std;

int N, Log2[NMax], RMQ[LgMax][NMax];

inline int Min (int a, int b)
{
    if (a<b)
    {
        return a;
    }
    return b;
}

void BuildLog2 ()
{
    for (int i=2; i<=N; ++i)
    {
        Log2[i]=Log2[i/2]+1;
    }
}

void BuildRMQ ()
{
    BuildLog2 ();
    for (int l=1; l<=Log2[N]; ++l)
    {
        int n=N-(1<<l)+1;
        for (int i=1; i<=n; ++i)
        {
            RMQ[l][i]=Min (RMQ[l-1][i], RMQ[l-1][i+(1<<(l-1))]);
        }
    }
}

int Query (int A, int B)
{
    int L=B-A+1, Dif=L-(1<<Log2[L]);
    return Min (RMQ[Log2[L]][A], RMQ[Log2[L]][A+Dif]);
}

int main()
{
    freopen ("rmq.in", "r", stdin);
    freopen ("rmq.out", "w", stdout);
    int M;
    scanf ("%d %d", &N, &M);
    for (int i=1; i<=N; ++i)
    {
        scanf ("%d", &RMQ[0][i]);
    }
    BuildRMQ ();
    for (; M>0; --M)
    {
        int A, B;
        scanf ("%d %d", &A, &B);
        printf ("%d\n", Query (A, B));
    }
    return 0;
}