Cod sursa(job #2158324)

Utilizator FrequeAlex Iordachescu Freque Data 10 martie 2018 12:02:26
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

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

const int NMAX = 1e5 + 5;
const int PMAX = 17;
const int INF = 0x3f3f3f3f;

int n, m, l, r;
int a[NMAX];
int rmq[NMAX][22];  // n, log2(n) ... minimul pe intervalul [i, i + 2^j - 1]

void build()
{
    for (int i = 1; i <= n; ++i)
        rmq[i][0] = a[i];
    for (int i = 1; i <= log2(n); ++i)
        for (int j = 1; j + (1 << i) - 1 <= n; ++j)
            rmq[j][i] = min(rmq[j][i - 1], rmq[j + (1 << (i - 1))][i - 1]);
}

int query(int l, int r)
{
    int minim = INF;
    int dif = r - l + 1;
    for (int p = 0; p <= 17; ++p)
        if (dif & (1 << p))
        {
            minim = min(minim, rmq[l][p]);
            l += (1 << p);
        }
    return minim;
}

void read()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        fin >> a[i];
}

int main()
{
    read();
    build();
    while (m--)
    {
        fin >> l >> r;
        fout << query(l, r) << '\n';
    }

    return 0;
}