Cod sursa(job #432180)

Utilizator ironhideAfterBurner ironhide Data 1 aprilie 2010 22:25:38
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <math.h>
#define GNT 2000000000;

long N,M,P,v[100002],min[1002],i,j,x,y,rad,rad1,rad2,Sol;
double wd;

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%ld%ld",&N,&M);
	for(i=1;i<=N;i++)
		scanf("%ld",&v[i]);
	wd=N;
	wd=sqrt(wd);
	rad=wd;
	for(i=1;i<=N/rad;i++)
	{
		min[i]=GNT;
		for(j=(i-1)*rad+1;j<=i*rad;j++)
			if(v[j]<min[i]) min[i]=v[j];
	}
	P=N/rad;
	if(N%rad!=0)
	{
		P++;
		min[P]=GNT;
		for(i=(N/rad)*rad+1;i<=N;i++)
			if(v[i]<min[P]) min[P]=v[i];
	}
	for(i=1;i<=M;i++)
	{
		scanf("%ld%ld",&x,&y);
		rad1=0;
		while(rad1<x) rad1+=rad;
		rad2=rad1-rad;
		while(rad2<=y) rad2+=rad;
		rad2-=rad;
		Sol=GNT;
		if(rad1<=rad2)
		{
			for(j=x;j<=rad1;j++)
				if(v[j]<Sol) Sol=v[j];
			for(j=rad2+1;j<=y;j++)
				if(v[j]<Sol) Sol=v[j];
			for(j=rad1/rad+1;j<=rad2/rad;j++)
				if(min[j]<Sol) Sol=min[j];
		}
		else
		for(j=x;j<=y;j++)
			if(Sol>v[j]) Sol=v[j];
		printf("%ld\n",Sol);
	}
	return 0;
}