Cod sursa(job #1563708)

Utilizator BugirosRobert Bugiros Data 6 ianuarie 2016 15:20:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
using namespace std;

const int MAXN = 100005;
const int LMAX = 17;//2 ^ 17 = 131072

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

int v[MAXN];
int rmq[LMAX][MAXN];//elementul minim din intervalul j, j + 2 ^ i
int lmax[MAXN];//cel mai mic nr x astfel incat 2^x <= i
int n;

void preprocesare()
{
    for (int i = 1;i <= n;++i)
        rmq[0][i] = v[i];
    lmax[1] = 0;
    for (int i = 2;i <= n;++i)
        lmax[i] = lmax[i / 2] + 1;
    for (int i = 1;(1 << i) <= n;++i)
        for (int j = 1;j <= n - (1 << i) + 1;++j)
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}

void intrebare()
{
    int x,y;
    in >> x >> y;
    int l = lmax[y - x + 1];
    int poz1 = x, poz2 = x + (y - x + 1) - (1 << l);
    out << min(rmq[l][poz1], rmq[l][poz2]);
}

int main()
{
    int nr_intrebari;
    in >> n >> nr_intrebari;
    for (int i = 1; i <= n;++i)
        in >> v[i];
    preprocesare();
    for (int i = 1;i <= nr_intrebari;++i)
    {
        intrebare();
        out << '\n';
    }
    return 0;
}