Cod sursa(job #581540)

Utilizator niovanIovan Alexandru niovan Data 14 aprilie 2011 12:20:22
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#include <cmath>
#define NMax 100000
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)

using namespace std;

FILE *fin=fopen("rmq.in","r"),*fout=fopen("rmq.out","w");

int A[NMax],Min[18][10000],n,m;

void Citire()
{
	int i,j;
	fscanf(fin,"%d%d",&n,&m);
	for(i=0;i<n;++i)
		fscanf(fin,"%d",&A[i]);
	for(j=0;j<n;++j) Min[0][j]=A[j];
}

void Procesare()
{
	int i,j;
	
	for(j=1;(1<<j)<=n;++j)
	{
		for(i=0;i+(1<<j)-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--)
	{
		fscanf(fin,"%d %d",&a,&b);
		fprintf(fout,"%d\n",Query(min(a,b)-1,max(a,b)-1));
	}
}

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