Cod sursa(job #626807)

Utilizator ContraPunctContrapunct ContraPunct Data 28 octombrie 2011 12:42:03
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#define NMAX 100002
using namespace std;

long int rmq[20][NMAX], n,m,ul, lg[NMAX], p2[NMAX], a[NMAX];

inline long int min(long int a, long int b)
{
if(a<b)
	return a;
return b;
}

int main()
{
	FILE *f,*g;
	f = fopen("rmq.in","r");
	g = fopen("rmq.out","w");
	long int i, x,y,diff,sh,j,l, aux;
	fscanf(f,"%ld %ld",&n,&m);
	
	lg[1]=0;
	fscanf(f,"%ld ",&a[1]);
	rmq[0][1]=a[1];
	
	for (i=2;i<=n;i++)
	{
		fscanf(f,"%ld ",&a[i]);
		rmq[0][i]=a[i];
		lg[i]=lg[i/2]+1;
	}
	
	p2[0]=1;
	//for(i=1;p2[ul]<=n;i++)
		//p2[++ul]=p2[ul-1]<<1;

	
	
	for (i=1; (1<<i) <=n;i++)
	{
		//aux = n-p2[i]+1;
		aux= n- (1<<i) +1;
		l=(1<<(i-1));
		
		for (j=1;j <= aux;j++)
		{
		rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+1]);
		/*if(rmq[i-1][j] < rmq[i-1][j+l])
			rmq[i][j]= rmq[i-1][j];
		else 
			rmq[i][j]= rmq[i-1][j+l];*/
		}
	}
	

	for (i=1;i<=m;i++)
	{
		fscanf(f,"%ld %ld",&x,&y);
		diff=y-x+1;
		l = lg[diff];
		sh = diff - (1<<l);
		fprintf(g,"%ld\n",min(rmq[l][x],rmq[l][x+sh]) );
	}	
	fclose(f);
	fclose(g);
	return 0;
}