Cod sursa(job #2755096)

Utilizator lazarstefania63@yahoo.comLazar Stefania [email protected] Data 26 mai 2021 19:29:00
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define INT_MAX 2147483647
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");


//segment tree size = 2^N
// total overlap, no overlap, partial overlap

int N, M, X, Y;
int seg_tree[400001];

void Build(int nod, int left, int right, int Pos, int Val)
{
    if (left == right)
    {
        seg_tree[nod] = Val;
        return;
    }

    int mij = (left + right) / 2;

    if (Pos <= mij)
        Build(2 * nod, left, mij, Pos, Val);
    if (Pos > mij)
        Build(2 * nod + 1, mij + 1, right, Pos, Val);

    if (seg_tree[2 * nod] < seg_tree[2 * nod + 1])
        seg_tree[nod] = seg_tree[2 * nod];
    else
        seg_tree[nod] = seg_tree[2 * nod + 1];
}

int RMQ(int pos, int sl, int sr, int left, int right)
{
	if (sl >= left && sr <= right)
		return seg_tree[pos];
	if (sr < left || sl > right)
		return INT_MAX;

	int mid = (sl + sr) / 2;

	return min(RMQ(2*pos, sl, mid, left, right), RMQ(2*pos + 1, mid+1, sr, left, right));
}

int main()
{
    f >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        f >> X; //citim valoarea
        Build(1, 1, N, i, X);
    }
    for (int i = 1; i <=M; i++)
    {
        f >> X >> Y;
        g << RMQ(1, 1, N, X, Y) << "\n";
    }

}