Cod sursa(job #1587423)

Utilizator HashiraGrigore Vlad Hashira Data 2 februarie 2016 00:22:15
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>

#include <vector>

#include <cmath>

std::vector < int > values;
std::vector < int > tree;

void build_tree(int node, int start, int end)
{
    if(start == end)
    {
        tree[node] = start;

        return;
    }

    int mid = (start + end) / 2;

    build_tree(2 * node, start, mid);
    build_tree(2 * node + 1, mid + 1, end);

    if(values[tree[2 * node]] <= values[tree[2 * node + 1]])
        tree[node] = tree[2 * node];
    else
        tree[node] = tree[2 * node + 1];
}

int rmq(int node, int start, int end, int s, int e)
{
    if(s > end || e < start)
        return -1;

    if(start >= s && end <= e)
        return tree[node];

    int mid = (start + end) / 2;

    int q1 = rmq(2 * node, start, mid, s, e);
    int q2 = rmq(2 * node + 1, mid + 1, end, s, e);

    if(q1 == -1)
        return q2;

    if(q2 == -1)
        return q1;

    if(values[q1] <= values[q2])
        return q1;

    return q2;
}

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

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

    values.assign(n, 0);

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

    int tree_size = pow(2, log2(n) + 2);
    tree.assign(tree_size, -1);

    build_tree(1, 0, n - 1);

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

        fout << values[rmq(1, 0, n - 1, s - 1, e - 1)] << "\n";
    }

    return 0;
}