Cod sursa(job #2902555)

Utilizator Bogdan197Putineanu Bogdan Bogdan197 Data 16 mai 2022 16:23:35
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;

int rmq[17][100010];

int rmq_query(int left, int right)	// range min
{
	int log = log2(right - left + 1);		// parte intreaga din log
	if (log == log2(right - left + 1))			// daca intervalul e putere a lui 2
		return rmq[log][left];
	return min(rmq[log][left], rmq[log][right - (1 << log) + 1]);		// altfel il compunem din 2 subintervale care se suprapun
}


int main()
{
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	int nr_valori, nr_operatii;
	f >> nr_valori >> nr_operatii;

	for (int i = 1; i <= nr_valori; i++)
		f >> rmq[0][i];

	for (int j = 1; 1 << j < nr_valori; j++)
		for (int i = 1; i + (1 << (j - 1)) <= nr_valori; i++)
			rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);		// construim range min query

	int left, right;
	for (int o = 0; o < nr_operatii; o++)
	{
		f >> left >> right;
		g << rmq_query(left, right) << "\n";
	}
}