Cod sursa(job #155259)

Utilizator JohnnyBravoJohnny Bravo JohnnyBravo Data 11 martie 2008 20:29:59
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>

const int MAX_N = 100001;
const int INF = 1000000000;

int N, M;
int value[MAX_N], BIT[MAX_N];

inline int min(const int &x, const int &y)
{
    return x < y ? x : y;
}

void insert(int p, int value)
{
    for(; p <= N; p += p ^ (p & (p - 1)))
        BIT[p] = min(BIT[p], value);
}

int query(int A, int B)
{
    if(A == B)
        return value[A];
    if((B & (B - 1)) >= A)
        return min(query(A, B & (B - 1)), BIT[B]);
    return min(query(A, B - 1), value[B]);
}


int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    int A, B;
    scanf("%d %d", &N, &M);
    for(int i = 1; i <= N; ++i)
        BIT[i] = INF;
    for(int i = 1; i <= N; ++i)
        scanf("%d", &value[i]), insert(i, value[i]);
    for(int i = 0; i < M; ++i)
    {
        scanf("%d %d", &A, &B);
        printf("%d\n", query(A, B));
    }

    return 0;
}