Cod sursa(job #772902)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 31 iulie 2012 15:03:56
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#define MOD 100000
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int A[MOD], Min[18][100000], n, m;

void Citire()
{
	int i,j;
	f>>n>>m;
	for(i=0;i<n;++i)
		f>>A[i];
	for(j=0;j<n;++j) Min[0][j]=A[j];
}

void Procesare(){
	int i,j,l1;
	for(j=1;(1<<j)<=n;++j)
	{
		l1=1<<j;
		for(i=0;i+l1-1<n;++i)
		{
			Min[j][i]=Min[j-1][i];
			Min[j][i]=min(Min[j][i],Min[j-1][i+(1<<(j-1))]);
		}
	}
}

int Query(int a,int b){
	int min,k;
	k=(int)log2(b-a);
	if(Min[k][a]<Min[k][b-(1<<k)+1]) min=Min[k][a];
		else min=Min[k][b-(1<<k)+1];
	return min;
}

void Raspunsuri(){
	int a,b;
	while(m--)
	{
		f>>a>>b;
		g<<Query(a-1,b-1)<<"\n";
	}
}

int main(){
	Citire();
	Procesare();
	Raspunsuri();
	return 0;
}