Cod sursa(job #154932)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 11 martie 2008 16:41:15
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 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*=2;
	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[2*j]<a[2*j+1])?a[2*j]:a[2*j+1];
			      s[j]=s[2*j]; d[j]=d[2*j+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(st<=s[poz]&&d[poz]<=dr) return a[poz];
	if(dr<s[poz]||st>d[poz]) return inf;
	m1=query(2*poz);
	m2=query(2*poz+1);
	m1=(m1<m2)?m1:m2;
	return m1;
}