Cod sursa(job #1502279)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 14 octombrie 2015 15:23:27
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;

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

int n, m;
vector <vector <int> > rmq;
vector <int> p2max;
void make_p2max()
{
	const int lim = 100005;
	p2max.push_back(0); p2max.push_back(0);
	for (int i = 2; i < lim; ++i)
		p2max.push_back(p2max[i / 2] + 1);
}
void make_rmq()
{
	for (int i = 1; (1 << i) < n; ++i)
	{
		rmq.push_back(*new vector<int>);
		//rmq[i].reserve(n + 5);
		for (int j = 0; j + (1 << i) - 1 < n; ++j)
			rmq[i].push_back(min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]));
			//rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
	}
}
int query(int x, int y)
{
	int imax = p2max[y - x];
	return min(rmq[imax][x], rmq[imax][y - (1 << imax) + 1]);
}
int main()
{
	int x, y;
	fin >> n >> m;

	rmq.push_back(*new vector<int>);
	for (int i = 0; i < n; ++i)
	{ 
		fin >> x;
		rmq[0].push_back(x);
	}
	make_p2max();
	make_rmq();
	for (int i = 0; i < m; ++i)
	{
		fin >> x >> y;
		fout << query(x - 1, y - 1) << '\n';
	}
	return 0;
}