Cod sursa(job #1204975)

Utilizator vasile_pojogaPojoga Vasile vasile_pojoga Data 4 iulie 2014 15:58:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

using namespace std;

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

int N,M,a[100005],MIN[100005][20];

void read();
void preprocess();
void solve();
int RMQ(int l, int r);

int main()
{
	read();
	preprocess();
	solve();
	return 0;
}

void read()
{
	fin>>N>>M;
	for(int i=1;i<=N;i++)
	{
		fin>>a[i];
	}
}

void preprocess()
{
	for(int i=1; i<=N; i++)
	{
		MIN[i][0] = i;
	}
	for(int j=1; (1 << j) <= N; j++)
	{
		for(int i=1; i + (1 << j) - 1 <= N; i++)
		{
			if(a[MIN[i][j-1]] <= a[MIN[i + (1 << (j-1))][j-1]])
			{
				MIN[i][j] = MIN[i][j-1];
			}
			else
			{
				MIN[i][j] = MIN[i + (1 << (j-1))][j-1];
			}
		}
	}
}

void solve()
{
	int l,r;
	for(int i=0; i<M; i++)
	{
		fin>>l>>r;
		fout<<RMQ(l,r)<<'\n';
	}
}

int RMQ(int l, int r)
{
	int s = r - l + 1;
	int k = -1; //=>log(s)
	while(s != 0)
	{
		k++;
		s = s>>1;
	}
	if(a[MIN[l][k]] < a[MIN[r - (1 << k) + 1][k]])
	{
		return a[MIN[l][k]];
	}
	else
	{
		return a[MIN[r - (1 << k) + 1][k]];
	}
}