Cod sursa(job #662649)

Utilizator lily3Moldovan Liliana lily3 Data 16 ianuarie 2012 21:17:45
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream>
#include<algorithm>
using namespace std;

int i,j,n,m,a[2000020],x,y,min1;
inline void creare(int nod,int st, int dr, int val)
{
	int mij;
	if(st==dr)
		a[nod]=val;
	else
	{
		mij=(st+dr)/2;
		if(mij>=i)
		creare(nod*2,st,mij,val);
		if(mij<i)
		creare(nod*2+1,mij+1,dr,val);
		a[nod]=min(a[nod*2],a[nod*2+1]);
	}
}
inline void det(int nod,int st, int dr, int A,int B)
{
	int mij;
	if(st>=A&&dr<=B)
	{
		if(a[nod]<min1)
			min1=a[nod];
		return ;
	}
	if(st<dr)
	{
		mij=(st+dr)/2;
		if(mij>=st)
			det(nod*2,st,mij,A,B);
		if(mij<dr)
			det(nod*2+1,mij+1,dr,A,B);
		a[nod]=min(a[nod*2],a[nod*2+1]);
	}
}
int main()
{
	FILE *f=fopen("rmq.in","r");
	FILE *g=fopen("rmq.out","w");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;++i)
	{
		fscanf(f,"%d",&x);
		creare(1,1,n,x);
	}
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d%d",&x,&y);
		min1=100010;
		det(1,1,n,x,y);
		fprintf(g,"%d\n",min1);
	}
	return 0;
}