Cod sursa(job #1961253)

Utilizator CammieCamelia Lazar Cammie Data 10 aprilie 2017 23:27:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <cmath>
#include <iostream>

#define MAXN 100002

using namespace std;

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

int val, nr, n, m, st, dr;
int a[25][MAXN];

inline void Read()
{
    fin >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        fin >> nr;
        a[0][i] = nr;
    }
}

inline void rmq_constructie_matrice()
{
    int nn = log2(n);
    for (int i = 1; i <= nn; i++)
    {
        val = 1 << i;
        for (int j = 1; j <= n - val; j++)
        {
             a[i][j] = min(a[i - 1][j], a[i - 1][j + val]);
        }
    }
}

inline void rmq_interogare()
{
    for (int i = 1; i <= m; i++)
    {
        fin >> st >> dr;

        if (st == dr) {
            fout << a[0][st] << "\n";
            continue;
        }

        nr = 1; val = 0;

        while (nr <= dr - st)
        {
            nr *= 2;
            val++;
        }
        val--; nr /= 2;

        fout << min(a[val][st], a[val][dr - nr + 1]) << "\n";
    }
}

int main ()
{
    Read();
    rmq_constructie_matrice();
    rmq_interogare();

    fin.close(); fout.close(); return 0;
}