Cod sursa(job #455390)

Utilizator dcm9000Dinu Cristian Mircea - UPB dcm9000 Data 13 mai 2010 18:03:53
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>

using namespace std;

#define FILE_IN "rmq.in"
#define FILE_OUT "rmq.out"

int N, M;
int V[24][100000];

static int min(int a, int b)
{
    return (a<b) ? a : b;
}

void preprmq()
{
    for (int k=1; k<24; k++)
    {
        int l = 1<<k;
        int lp2 = 1<<(k-1);
        for (int i=0; i<N-l; i++)
        {
            V[k][i] = min(V[k-1][i], V[k-1][i+lp2]);
        }
    }
}

int rmq(int a, int b)
{
    a--;
    b -= a;

    int cr = V[0][a];
    while (b>0)
    {
        int s = 31-__builtin_clz(b);

        cr = min(cr, V[s][a]);

        a += 1 << s;
        b -= 1 << s;
    }

    return cr;
}

int main()
{
    ifstream fisIn(FILE_IN);
    ofstream fisOut(FILE_OUT);

    fisIn >> N >> M;
    for (int i=0; i<N; i++) fisIn >> V[0][i];

    preprmq();

    for (int i=0; i<M; i++)
    {
        int a,b;
        fisIn >> a >> b;
        fisOut << rmq(a,b) << '\n';
    }
}