Cod sursa(job #1587427)

Utilizator HashiraGrigore Vlad Hashira Data 2 februarie 2016 00:31:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>

#include <vector>

#include <cmath>

int main()
{
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    int n, q;
    fin >> n >> q;

    std::vector < int > values(n + 1);

    for(int i = 0 ; i < n ; ++i)
        fin >> values[i];

    const int logn = log2(n);
    std::vector < std::vector < int > > table(n + 1, std::vector< int >(logn + 5));

    for(int i = 0 ; i < n ; ++i)
        table[i][0] = i;

    for(int j = 1 ; (1 << j) <= n ; ++j)
    {
        for(int i = 0 ; i + (1 << (j - 1)) < n ; ++i)
            if(values[table[i][j - 1]] <= values[table[i + (1 << (j - 1))][j - 1]])
                table[i][j] = table[i][j - 1];
            else
                table[i][j] = table[i + (1 << (j - 1))][j - 1];
    }

    while(q--)
    {
        int s, e;
        fin >> s >> e;

        s--;
        e--;

        int k = e - s;
        k = 31 - __builtin_clz(k + 1);
        fout << std::min(values[table[s][k]], values[table[e - (1 << k ) + 1][k]]) << "\n";
    }

    return 0;
}