Cod sursa(job #2749515)

Utilizator LordNecrateBiowCuciureanu Dragos-Adrian LordNecrateBiow Data 6 mai 2021 22:04:00
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
#include <math.h>
#include <vector>
#include <limits.h>

using namespace std;

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

int MinArb[400005];
int start, finish, val, poz, minim;

void modificare(int nod, int left, int right)
{
	if (left == right)
	{
		MinArb[nod] = val;
		return;
	}

	int mij = (left + right) / 2;
	if (poz <= mij)
		modificare(2 * nod, left, mij);
	else
		modificare(2 * nod + 1, mij + 1, right);

	MinArb[nod] = min(MinArb[2 * nod], MinArb[2 * nod + 1]);
}

void determinare_min(int nod, int left, int right)
{
	if (start <= left && right <= finish)
	{
		if (minim > MinArb[nod])
			minim = MinArb[nod];
		return;
	}

	int mij = (left + right) / 2;
	if (start <= mij) determinare_min(2 * nod, left, mij);
	if (mij < finish) determinare_min(2 * nod + 1, mij + 1, right);
}

int main()
{
	int a, b, x, n, m;
	fin >> n >> m;

	for (int i = 1; i <= n; i++)
	{
		fin >> x;
		poz = i;
		val = x;
		modificare(1, 1, n);
	}

	for (int i = 1; i <= m; i++)
	{
		fin >> a >> b;

		minim = 100000;
		start = a;
		finish = b;
		determinare_min(1, 1, n);

		fout << minim << "\n";
	}

	return 0;
}