Cod sursa(job #2536890)

Utilizator sebimihMihalache Sebastian sebimih Data 2 februarie 2020 19:30:00
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <iostream>
#include <algorithm>
#include <fstream>

using namespace std;

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

const int N = 100005;
const int P = 20;

int rmq[P][N], Nivel[N];
int n, m;

void PreCompute()
{
	Nivel[1] = 0;
	for (int i = 2; i < N; i++)
	{
		Nivel[i] = Nivel[i / 2] + 1;
	}

	for (int p = 1; (1 << p) <= n; p++)
	{
		for (int i = 0; i + (1 << p) <= n; i++)
		{
			rmq[p][i] = min(rmq[p - 1][i], rmq[p - 1][i + (1 << (p - 1))]);
		}
	}
}

int SolveQuery(int l, int r)
{
	int Dist = r - l + 1;
	int p = Nivel[Dist];
	return min(rmq[p][l], rmq[p][r - (1 << p) + 1]);
}

int main()
{
	fin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		fin >> rmq[0][i];
	}

	PreCompute();

	int l, r;
	while (m--)
	{
		fin >> l >> r;
		l--;
		r--;

		fout << SolveQuery(l, r) << '\n';
	}
	return 0;
}