Cod sursa(job #2310709)

Utilizator ReeeBontea Mihai Reee Data 1 ianuarie 2019 21:35:40
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#define NMax 100001
#define INF 900000

using namespace std;

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

int interval_tree[NMax * 4];

void BuildTree(int Node, int Left, int Right)
{
    if ( Left == Right )
        fin >> interval_tree[Node];
    else
    {
        int Mid = (Left + Right) / 2;
        BuildTree(2 * Node, Left, Mid);
        BuildTree(2 * Node + 1, Mid + 1, Right);
        interval_tree[Node] = min(interval_tree[2 * Node], interval_tree[2 * Node + 1]);
    }
}

int Query(int Node, int Left, int Right, int A, int B)
{
    if (A <= Left && Right <= B)
        return interval_tree[Node];
    else
    {
        int res1 = INF, res2 = INF;
        int Mid = (Left + Right) / 2;
        if (A <= Mid)
            res1 = Query(2 * Node, Left, Mid, A , B);
        if (B > Mid)
            res2 = Query(2 * Node + 1, Mid + 1, Right, A, B);
        return min(res1, res2);
    }
}

int main()
{
    int N, M, x, y;
    fin >> N >> M;
    BuildTree(1, 1, N);
    for (int i = 1 ; i <= M ; ++i)
    {
        fin >> x >> y;
        fout << Query(1, 1, N, x, y) << '\n';
    }
    return 0;
}