Cod sursa(job #1652693)

Utilizator Toast97Calin Farcas Toast97 Data 15 martie 2016 12:00:46
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <math.h>

using namespace std;

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

int v[100005], best[100005][18], n, m;

int minim (int a, int b)
{
    if (a < b)
        return a;
    return b;
}

void precalc ()
{
    for (int i = 1; i <= n; i ++)
        best[i][0] = i;

    for (int j = 1; (1 << j) <= n; j ++)
        for (int i = 1; (i + (1 << j) - 1) <= n; i ++)
                if (v[best[i][j - 1]] < v[best[i + (1 << (j - 1))][j - 1]])
                    best[i][j] = best[i][j - 1];
                else
                    best[i][j] = best[i + (1 << (j - 1))][j - 1];

}

int rmq (int x, int y)
{
    int k = log2 (y - x + 1);

    if (v[best[x][k]] < v[best[y - (1 << k) + 1][k]])
        return v[best[x][k]];
    return v[best[y - (1 << k) + 1][k]];
}

int main()
{
    int x, y;

    f >> n >> m;

    for (int i = 1; i <= n; i ++)
        f >> v[i];

    precalc ();

    for (int i = 1; i <= m; i ++)
    {
        f >> x >> y;

        g << rmq (x, y) << '\n';
    }

    f.close ();
    g.close ();
    return 0;
}