Cod sursa(job #2761225)

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

int N, M;
int m[505][500005];

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 < 505; ++i)   
		for (int j = 0; j < 500005; ++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
	int i = 1;
	for (int l = 2; l <= N; l *= 2)
		//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];
		++i;
	}

}

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;
}