Cod sursa(job #589516)

Utilizator geniucosOncescu Costin geniucos Data 12 mai 2011 18:17:28
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>
#include<math.h>
using namespace std;
FILE *f,*g;
long n,m,x,y,i,j,k,b[100001],a[100001][17];
int main()
{
f=fopen("rmq.in","r");
g=fopen("rmq.out","w");
fscanf(f,"%ld",&n);
fscanf(f,"%ld",&m);
for(i=1;i<=n;i++)
	fscanf(f,"%ld",&b[i]);
for(i=1;i<=n;i++)
	a[i][0]=i;
for(j=1;(1<<j)<n;j++)
	for(i=0;i+(1<<j)-1<=n;i++)
	{
		if(b[a[i][j-1]]<b[a[i+(1<<j-1)][j-1]]) a[i][j]=a[i][j-1];
		else a[i][j]=a[i+(1<<j-1)][j-1];
	}
/*for(i=1;i<=n;i++)
{
	for(j=0;(1<<j)<n;j++)
		fprintf(g,"%ld ",a[i][j]);
	fprintf(g,"\n");
}*/
for(x=1;x<=m;x++)
{
	fscanf(f,"%ld",&i);
	fscanf(f,"%ld",&j);
	k=int(log(j-i+1));
	if(b[a[i][k]]>b[a[j-((1<<k)-1)][k]]) fprintf(g,"%ld",b[a[j-((1<<k)-1)][k]]);
	else fprintf(g,"%ld",b[a[i][k]]);
	fprintf(g,"\n");
}
fclose(f);
fclose(g);
return 0;
}