Cod sursa(job #2761246)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 1 iulie 2021 11:52:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int N, M;
int m[30][300005];

int query(int a, int b)
{
	int L = b - a + 1;
	int putere = 1, ct = 0;

	//cautam cea mai mare putere a lui 2 mai mica decat lungimea intervalului
	while (putere * 2 <= L)  putere *= 2, ct++;

	if (m[ct][a] < m[ct][b - putere + 1]) return m[ct][a];
	return  m[ct][b - putere + 1];
}

void Initializare()
{
	//100005 nu infl afl min
	for (int i = 0; i < 30; ++i)   
		for (int j = 0; j < 300005; ++j)  m[i][j] = 100005;
}

void Citire()
{
	fin >> N >> M;
	//prima linie a matr e vectorul
	for (int i = 0; i < N; ++i)  fin >> m[0][i]; 
}

void contMatr()
{
	//l=2^i
	for (int l = 2, i = 1; l <= N; l *= 2,++i)
		//val[i][j] = minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
		for (int j = 0; j < N; ++j)
			if (m[i - 1][j] < m[i - 1][j + l / 2])
				m[i][j] = m[i - 1][j];
			else
				m[i][j] = m[i - 1][j + l / 2];
}

void Rezolvare()
{
	int a, b;
	for (int i = 1; i <= M; ++i)
	{
		// capetele intervalului
		fin >> a >> b;
		//m indexata de la 0
		fout << query(a - 1, b - 1) << "\n"; 
	}
}


int main()
{
	Initializare();
	Citire();
	contMatr();
	Rezolvare();
	return 0;
}