Cod sursa(job #2219940)

Utilizator AlexDabuDabu Alexandru AlexDabu Data 10 iulie 2018 00:47:56
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 100002
#define LOGMAX 18
#define min(a, b) (a < b) ? a : b

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

int main(void)
{
	int n, m, a, b;
	int lg[NMAX], diff, minim;
	int rmq[LOGMAX][NMAX];

	fin >> n >> m >> rmq[0][1];

	int i, j;
	for (i = 2; i <= n; i++)
	{
		fin >> rmq[0][i];
		lg[i] = lg[i / 2] + 1;
	}

	for (i = 1; (1 << i) <= n; i++)
	{
		for (j = 1; j + (1 << i) - 1 <= n; j++)
		{
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << i) / 2]);
		}
	}

	for (i = 0; i < m; i++)
	{
		fin >> a >> b;
		diff = lg[b - a + 1];
		minim = min(rmq[diff][a], rmq[diff][b - (1 << diff) + 1]);
		fout << minim << '\n';
	}
	return 0;
}