Cod sursa(job #581508)

Utilizator niovanIovan Alexandru niovan Data 14 aprilie 2011 11:59:34
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <cmath>
#include <stdlib.h>
#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[NMax],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[j]=(int*)realloc(Min[j],(log2(n-j)+1)*sizeof(int));
	for(j=0;j<n;++j) Min[j][0]=A[j];
}

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

int Query(int a,int b)
{
	int min,k;
	k=log2(b-a);
	if(Min[a][k]<Min[b-(1<<k)+1][k]) min=Min[a][k];
		else min=Min[b-(1<<k)+1][k];
	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()
{
	int a,b;
	Citire();
	Procesare();
	Raspunsuri();
	
	return 0;
}