Cod sursa(job #155274)

Utilizator JohnnyBravoJohnny Bravo JohnnyBravo Data 11 martie 2008 20:38:05
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 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)
{
    int ret = INF;
    while(A <= B)
        if(A == B)
        {
            ret = min(ret, value[B]);
            --B;
        }
        else
            if((B & (B - 1)) >= A)
            {
                ret = min(ret, BIT[B]);
                B &= (B - 1);
            }
            else
            {
                ret = min(ret, value[B]);
                B--;
            }
    return ret;
}


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;
}