Cod sursa(job #178895)

Utilizator znakeuJurba Andrei znakeu Data 15 aprilie 2008 12:56:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#define MAXN 100100

int a[MAXN][20];
int v[MAXN];
int n,m;
int p2[20];
int log[MAXN];


void citire()
{
	int i;
	char temp[50];
	
	scanf("%d%d",&n,&m);
	gets(temp);
	
	for (i=0; i<n; ++i)
	{
		scanf("%d",&v[i]);	
		gets(temp);
	}
}


inline int minim(int a, int b)
{
	if (a>b)
		return b;
	return a;	
}


void makea()
{
	int i,j;
	for (i=1,p2[0]=1; i<20; i++)
		p2[i]=p2[i-1]<<1;
	
	for (i=0; i<n; i++)
		a[i][0]=v[i];
	
	for (i=n-1; i>=0; i--)
		for (j=1; i+p2[j]<=n; j++)
			a[i][j]=minim(a[i][j-1],a[i+p2[j-1]][j-1]);
}


void makelog()
{
	int i,j;
	log[0]=0;
	for (i=1,j=0; i<n; i++)
		if (p2[j+1]>i)
			log[i]=j;
		else
			log[i]=++j;	
}


void rezolva()
{
	int i,l,x,y,j,r;
	
	char temp[50];
	
	for (i=0; i<m; i++)
	{
		gets(temp); x=0; y=0; j=0;
		
		while (temp[j]>='0' && temp[j]<='9')
			x=x*10+temp[j++]-'0';
		
		j++;
		
		while (temp[j]>='0' && temp[j]<='9')
			y=y*10+temp[j++]-'0';
		
		x--; y--;
		
		l=log[y-x+1];
		r=minim(a[x][l],a[y-p2[l]+1][l]);
		printf("%d\n",r);
	}
}


int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	citire();
	makea();
	makelog();
	rezolva();	
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}