Cod sursa(job #1699487)

Utilizator D4n13LMuntean Dan Iulian D4n13L Data 7 mai 2016 14:46:02
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <cmath>
int Mat[100001][30];
int v[100001];



int main()
{
	std::ifstream inf("rmq.in");
	std::ofstream outf("rmq.out");
	int N, M;
	inf >> N >> M;
	for(int i = 1; i <= N; i++)
	{
		inf >> v[i];
	}

	//Algoritmul RMQ
	//Mat[i][j] = Mat[i][j-1] daca v[Mat[i][j-1]] <= v[Mat[i + 2 ^ (j-1)][j-1]]
	//			= Mat[i + 2 ^(j-1)][j-1] altfel

	//conditii initiale
	for(int i = 1; i <= N; i++)
		Mat[i][0] = i;

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

	for(int i = 0; i < M; i++)
	{
		int x, y;
		inf >> x >> y;
		int k = (int)log2((double)(y -x + 1));
		if(v[Mat[x][k]] <= v[Mat[y - (1<< k) + 1][k]])
			outf << v[Mat[x][k]] << "\n";
		else
			outf << v[Mat[y - (1 << k) + 1][k]] <<"\n";

	}

	inf.close();
	outf.close();
	return 0;

}