Cod sursa(job #178885)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 15 aprilie 2008 12:42:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#include <math.h>
#define N 100001
#define M 1000
int puteri[20],lg[100000],a[N][20];
int n,m;
inline int  min(int xx,int yy)
{
	if(xx<yy) return xx;
	return yy;
}
void scan()
{
	freopen("rmq.in", "r",stdin);
	freopen("rmq.out", "w",stdout);
	scanf("%d%d", &n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d", &a[i][0]);
}		
void solve()
{
	int x=1,y,put=0;
	lg[1]=0;  
	puteri[0]=1;  
    for (int i=2;i<=100000;i++,lg[i]=put )  
        if (x*2<=i)  
        {  
            x*=2;  
            put++;  
            puteri[put]=x;  
        }  
	
	puteri[put+1]=x*2;  
    for(int i=n;i>=1;--i)  
        for(int j=1;i+puteri[j]<=n+1;++j)  
            a[i][j]=min(a[i][j-1],a[i+puteri[j-1]][j-1]);  
    for (int i=1;i<=m;i++)  
    {  
        scanf("%d%d",&x,&y);  
        printf("%d\n",min(a[x][lg[y-x+1]],a[y-puteri[lg[y-x+1]]+1][lg[y-x+1] ]) );  
    } 
}	
int main()
{
	scan();
	solve();
	return 0;
}