Cod sursa(job #1961221)

Utilizator CammieCamelia Lazar Cammie Data 10 aprilie 2017 22:59:25
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 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()
{
    val = 1; int nn = log2(n);
    for (int i = 1; i <= nn; i++)
    {
        for (int j = 1; j <= n; j++)
        {
             a[i][j] = min(a[i - 1][j], a[i - 1][j + val]);
        }
        val *= 2;
    }
}

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

        nr = log2(dr - st + 1);
        val = pow(2, dr - st - 1);

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

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

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