Cod sursa(job #1752008)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 2 septembrie 2016 15:34:38
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 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;
		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;
}