Cod sursa(job #1166513)

Utilizator ChallengeMurtaza Alexandru Challenge Data 3 aprilie 2014 17:17:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <algorithm>

using namespace std;

const char InFile[] = "rmq.in";
const char OutFile[] = "rmq.out";
const int MaxN = 100111;
const int LogMaxN = 20;

ifstream fin(InFile);
ofstream fout(OutFile);

int N, M, x, y, lg[MaxN], rmq[LogMaxN][MaxN];

int main()
{
	fin >> N >> M;
	for (register int i = 1; i <= N; ++i)
	{
		fin >> rmq[0][i];
	}

	for (register int i = 2; i <= N; ++i)
	{
		lg[i] = lg[i>>1]+1;
	}

	int step = 1;
	for (register int i = 1; i < LogMaxN; ++i, step<<=1)
	{
		for (register int j = 1; j <= N; ++j)
		{
			if (j + step>MaxN)
			{
				rmq[i][j] = rmq[i - 1][j];
			}
			else
			{
				rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+step]);
			}
		}
	}

	for (register int i = 1; i <= M; ++i)
	{
		fin >> x >> y;
		if (x > y)
		{
			swap(x, y);
		}
		int len = y-x+1;
		fout << min(rmq[lg[len]][x],rmq[lg[len]][y-(1<<lg[len])+1]) << "\n";
	}
	fin.close();
	fout.close();
	return 0;
}