Cod sursa(job #156303)

Utilizator megabyteBarsan Paul megabyte Data 12 martie 2008 14:29:23
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
#define INF "rmq.in"
#define OUF "rmq.out"
#define MIN(A,B) ((A<B)?(A):(B))

const int NMAX=100002;
const int LG=18;
const int BIG=(1<<20);
int n,a[NMAX],rmq[NMAX][LG];
int mlg[NMAX]={0};

void mlg_init()
{
     mlg[0]=-1;
     int i=1,p=0;
     for(i=1;i<=n;++i)
     if(i==(1<<p))
     {
                  mlg[i]=mlg[i-1]+1;
                  ++p;
     }
     else mlg[i]=mlg[i-1];
}

void preproc()
{
     int i,j;

     for(i=0;i<=n;++i)
     for(j=0;j<LG;++j) rmq[i][j]=BIG;
     
     for(i=1;i<=n;++i) rmq[i][0]=a[i];
     
     for(j=1;(1<<j)<=n;++j)
       for(i=1;(i+(1<<j)-1)<=n;++i) rmq[i][j]=MIN(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}

int main()
{
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	int i,m,x,y,k,sol;
	fscanf(in,"%d%d",&n,&m);
	for(i=1;i<=n;++i) fscanf(in,"%d",a+i);
	
	mlg_init();
	preproc();

	i=1;
	while(i<=m)
	{
		fscanf(in,"%d%d",&x,&y);
		k=mlg[y-x+1];
                sol=MIN(rmq[x][k],rmq[y-(1<<k)+1][k]);
		fprintf(out,"%d\n",sol);
		++i;
	}

	fclose(in);fclose(out);
	return 0;
}