Cod sursa(job #1752343)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 3 septembrie 2016 16:12:48
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <algorithm>

using namespace std;

int* ReadVector(int n, istream &fin);
int** CreateRmqMatrix(int n, int* list);
void ApplyQuerys(int m, int **matrix, int *list, istream &fin, ostream& fout);
int ComputeLog(int n);

int main()
{
	ifstream fin;
	ofstream fout;
	fout.open("rmq.out");
	fin.open("rmq.in");

	int n, m;
	fin >> n >> m;

	int* list = ReadVector(n, fin);
	int** matrix = CreateRmqMatrix(n, list);

	ApplyQuerys(m, matrix, list, fin, fout);

	fin.close();
	fout.close();
	return 0;
}

int* ReadVector(int n, istream &fin)
{
	int *list = new int[n + 1]();

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

	return list;
}

int** CreateRmqMatrix(int n, int* list)
{
	int lg = ComputeLog(n);
	int** matrix = new int*[n + 1]();
	for (int i = 0; i < n + 1; i++)
	{
		matrix[i] = new int[lg + 1]();
	}

	for (int i = 0; i < n; i++)
	{
		matrix[0][i] = i;
	}

	for (int i = 1; (1 << i) <= n; i++)
		for (int j = 0; j + (1 << i) - 1 < n; j++)
			if (list[matrix[i - 1][j]] < list[matrix[i - 1][j + (1 << (i - 1))]])
				matrix[i][j] = matrix[i - 1][j];
			else
				matrix[i][j] = matrix[i - 1][j + (1 << (i - 1))];

	return matrix;
}

void ApplyQuerys(int m, int **matrix, int *list, istream &fin, ostream& fout)
{
	int x, y;

	for (int i = 1; i <= m; i++)
	{
		fin >> x >> y;
		if (x == y)
			fout << list[matrix[0][x - 1]] << "\n";
		else
		{
			int k = ComputeLog(y - x);
			fout << min(list[matrix[k][x - 1]], list[matrix[k][y - (1 << k)]]) << "\n";
		}
		
	}
}

int ComputeLog(int n)
{
	int r = 0;

	while ((1 << r) <= n)
	{
		r++;
	}

	return --r;
}