Cod sursa(job #1673359)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 3 aprilie 2016 18:11:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

const int dmax = 100001;
const int Log = 18;

int v[dmax];

int lg[dmax];

int rmq[Log][dmax]; /* rmq[i][j] == MINIMUL DINTR-UN INTERVAL DE LUNGIME 2 ^ i CARE SE TERMINA PE POZITIA j */

int N, Q;

int minim(int x, int y)
{
    if(x < y) return x;
    else
        return y;
}

void read()
{
    in >> N >> Q;

    for(int i = 1; i <= N; i++) in >> v[i];
}

void RMQ()
{
    int i, j;

    lg[1] = 0;
    for(i = 2; i <= N; i++) lg[i] = lg[i/2] + 1;

    for(j = 1; j <= N; j++) rmq[0][j] = v[j];

    for(i = 1; (1 << i) <= N; i++)
        for(j = 1; j <= N; j++)
            rmq[i][j] = minim(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);
}

void query()
{
    int i, a, b, ans;

    for(i = 1; i <= Q; i++)
    {
        in >> a >> b;

        int l = lg[b - a + 1];

        ans = minim(rmq[l][b], rmq[l][a + (1 << l) - 1]);

        out << ans << '\n';
    }
}

int main()
{
    read();
    RMQ();
    query();

    return 0;
}