Cod sursa(job #265964)

Utilizator yoyolichIoana Ardeleanu yoyolich Data 24 februarie 2009 19:48:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<vector>
#define DIM 8192
using namespace std;
#define maxn 100001
#define logmax 18
FILE *f=fopen("rmq.in","r"), *g=fopen("rmq.out","w");
long int log[maxn],rmq[maxn][logmax],i,j,x,y,n,m;

/*inline long int min(long int x, long int y)
{
	if(x<y) return x;
	return y;
}*/
char ax[DIM];
int pz;
inline void cit(long int &x)
{
	 x=0;   
    while(ax[pz]<'0' || ax[pz]>'9')   
        if(++pz==DIM)fread(ax,1,DIM,f),pz=0;   
       
    while(ax[pz]>='0' && ax[pz]<='9')   
    {   
        x=x*10+ax[pz]-'0';   
        if(++pz==DIM)fread(ax, 1, DIM,f),pz=0;   
    }   
}   
int main()
{
	cit(n);cit(m);
	for(i=1;i<=n;i++) cit(rmq[i][0]);
	
	log[1]=0;
	for(i=2;i<=n;i++)
		log[i]=log[i/2]+1;
	
	
	
	for(j=1;(1<<j)<=n;j++)
		for(i=1;i<=n-(1<<j)+1;i++)
			rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
	
		
	for(i=1;i<=m;i++)
	{
		cit(x);cit(y);
		int k=log[y-x+1];
		fprintf(g,"%ld\n",min(rmq[x][k],rmq[y-(1<<k)+1][k]));
	}
	
	fclose(f);
	fclose(g);
	return 0;
}