Cod sursa(job #2037309)

Utilizator robuvedVictor Robu robuved Data 11 octombrie 2017 23:21:24
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");
#define MAX 100000
#define MAXL 20
int N, M;
int v[MAX];
int dp[MAX][MAXL];

void BuildDP()
{
	for (int i = 0; i < N; i++)
	{
		dp[i][0] = i;
	}
	for (int j = 1; (1 << j) <= N; j++)
	{
		for (int i = 0; i + (1 << j) - 1 < N; i++)
		{
			if (v[dp[i][j - 1]] < v[dp[i + (1 << (j - 1))][j - 1]])
				dp[i][j] = dp[i][j - 1];
			else
				dp[i][j] = dp[i + (1 << (j - 1))][j - 1];
		}
	}

}

int Query(int x, int y)
{
	int dif = y - x + 1;
	int p = 0;
	while((1 << (1 + p)) <= dif) p++;
	return min(v[dp[x][p]], v[dp[y - (1 << p) + 1][p]]);
}
int main()
{
	in >> N >> M;
	for (int i = 0; i < N; i++)
	{
		in >> v[i];
	}
	BuildDP();
	for (int i = 0; i < M; i++)
	{
		int x, y;
		in >> x >> y;
		out << Query(x - 1 , y - 1) << '\n';
	}
}