Cod sursa(job #1512445)

Utilizator rumburakrumburak rumburak Data 28 octombrie 2015 06:54:55
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

const int N = 100000, L = 17;

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

int v[1 + N], log[1 + N], r[1 + N][L], n, q;

int min(int x, int y)
{
    return x < y ? x : y;
}

void citireVector()
{
    in >> n >> q;
    for (int i = 1; i <= n; i++)
        in >> v[i];
}

void calculLog()
{
    int i, vlog = 0;
    for (i = 1; i <= n; i++)
    {
        if (i >= (1 << vlog)) vlog++;
        log[i] = vlog - 1;
    }
}

void constructieMatrice()
{
    for (int i = 1; i <= n; i++)
    {
        r[i][0] = v[i];
        for (int j = 1; 1 << j <= i; j++)
            r[i][j] = min(r[i][j - 1], r[i - (1 << (j - 1))][j - 1]);
    }
}

int raspuns(int a, int b)
{
    int lung = log[b - a  + 1];
    return min(r[a + (1 << lung)][lung], r[b][lung]);
}

void raspundeIntrebari()
{
    int a, b, i;
    for (i = 1; i <= q; i++)
    {
        in >> a >> b;
        out << raspuns(a, b) << "\n";
    }
    in.close();
    out.close();
}

int main()
{
    citireVector();
    calculLog();
    constructieMatrice();
    raspundeIntrebari();
    return 0;
}