Cod sursa(job #2404550)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 13 aprilie 2019 00:23:45
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <iostream>
#define nmax 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, a[nmax], rmq[nmax][22];
int lft, rgh;
int l2(int x)
{
	if (x<=1) return 0;
	int ans = 0, act = 1;
	while (true)
	{
		if (act > x) return ans - 1;
		act *= 2, ++ans;
	}
}
int main()
{
	fin>>n>>m;
	for (int i=1;i<=n;++i)
		fin>>a[i];
	for (int i=1;i<=n;++i)
		rmq[i][0] = i;
	for (int j=1; (1<<j) <= n; ++j)
	{
		for (int i=1;i + (1<<j) - 1 <=n ;++i)
		{
			if ( a[rmq[i][j-1]] < a[rmq[i+(1<<(j-1))][j-1]] )
			{
				rmq[i][j] = rmq[i][j-1];
			}
			else
			{
				rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
			}
		}
	}
	for (int i=1;i<=m;++i)
	{
		fin>>lft>>rgh;
		int d = rgh - lft + 1;
		int p2 = l2(d);
		int rm = d - (1<<p2);
		if (a[rmq[lft][p2]] < a[rmq[lft+rm][p2]])
			fout<<a[rmq[lft][p2]]<<'\n';
		else
			fout<<a[rmq[lft+rm][p2]]<<'\n';
	}
	return 0;
}