Cod sursa(job #154942)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 11 martie 2008 16:48:40
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<stdio.h>
long m,n,t,i,j,a[270000],s[270000],d[270000],st,dr,zero=1,inf=100001;
long query( long poz);
int main()
{	FILE *f=fopen("rmq.in","r"),
	     *g=fopen("rmq.out","w");
	fscanf(f,"%ld%ld",&n,&m);
	while(zero<n) zero<<=1;
	zero--;
	for(i=1;i<=n;i++){ fscanf(f,"%ld",&a[zero+i]); s[zero+i]=i; d[zero+i]=i;}
	for(j=i;j<=zero+1;j++){a[zero+j]=inf;s[zero+j]=j;d[zero+j]=j;}
	for(j=zero;j>=1;j--){ a[j]=(a[j<<1]<a[(j<<1)|1])?a[j<<1]:a[(j<<1)|1];
			      s[j]=s[j<<1]; d[j]=d[(j<<1)|1];
			      }
	for(t=1;t<=m;t++)
	{  fscanf(f,"%ld%ld",&st,&dr);
	   fprintf(g,"%ld\n",query(1));
	}

	fcloseall();
	return 0;
}
long query( long poz)
{       long m1,m2;
	if(dr<s[poz]) return inf;
	if(st>d[poz]) return inf;
	if(st<=s[poz]&&d[poz]<=dr) return a[poz];
	m1=query(poz<<1);
	m2=query((poz<<1)|1);
	m1=(m1<m2)?m1:m2;
	return m1;
}