Cod sursa(job #155303)

Utilizator JohnnyBravoJohnny Bravo JohnnyBravo Data 11 martie 2008 20:57:36
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
using namespace std;

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((B & (B - 1)) >= A)
        {
            ret = min(ret, BIT[B]);
            B &= (B - 1);
        }
        else
            ret = min(ret, value[B--]);
    return ret;
}


int main()
{
    ifstream input;
    input.open("rmq.in");
    ofstream output;
    output.open("rmq.out");

    int A, B;
    input >> N >> M;
    for(int i = 1; i <= N; ++i)
        BIT[i] = INF;
    for(int i = 1; i <= N; ++i)
        input >> value[i], insert(i, value[i]);
    for(int i = 0; i < M; ++i)
    {
        input >> A >> B;
        output << query(A, B) << "\n";
    }

    return 0;
}