Cod sursa(job #3155482)

Utilizator teodor_tohteodor toh teodor_toh Data 8 octombrie 2023 14:57:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include<fstream>
#include<algorithm>
#include<math.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int arr[17][100000], n;

void buildTabel()
{
	int i, logarithm = (int)(log2(n)), j,power;
	for (i = 1; i <= logarithm; i++)
	{
		power = (int)(pow(2, i - 1));
		for (j = 0; j < n - ((2 * i) - 1); j++)
		{
			arr[i][j] = min(arr[i - 1][j], arr[i - 1][j + power]);
		}
	}
}

int findMin(int a, int b)
{
	int i, len, loga, mini,power;
	len = b - a + 1;
	loga = log2(len);
	mini = arr[loga][a];
	power = pow(2, loga);
	a += power;
	len -= power;
	while (len > 0)
	{
		loga = log2(len);
		mini = min(mini, arr[loga][a]);
		power = pow(2, loga);
		a += power;
		len -= power;
	}
	return mini;
}
int main()
{
	int m, i,a,b,min;
	fin >> n;
	fin >> m;
	for (i = 0; i < n; i++)
		fin >> arr[0][i];
	buildTabel();
	for (i = 0; i < m; i++)
	{
		fin >> a;
		fin >> b;
		a--;
		b--;
		min = findMin(a, b);
		cout << min << "\n";
		fout << min << "\n";
	}
}