Cod sursa(job #170153)

Utilizator ProtomanAndrei Purice Protoman Data 2 aprilie 2008 14:11:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>
long n,m;
long lg[100010];
long a[21][100010];

int min(long x, long y)
{
	if (x<y)
		return x;
	else return y;
}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	for (int i=1; i<=n; i++)
		scanf("%ld",&a[0][i]);
	for (int i=2; i<=n; i++)
		lg[i]=lg[i/2]+1;
	int h=1;
	for (int i=1; i<=lg[n]; i++)
	{
		h=h*2;
		for (int j=1; j<=n-h+1; j++)
			a[i][j]=min(a[i-1][j],a[i-1][j+h/2]);
	}
	for (int i=0; i<m; i++)
	{
		int x,y;
		scanf("%ld %ld",&x,&y);
		int L=y-x+1;
		int l=lg[L];
		int lung=1<<l;
		printf("%ld\n",min(a[l][x],a[l][y-lung+1]));
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}