Cod sursa(job #370428)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 1 decembrie 2009 11:40:23
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.06 kb
#include<stdio.h>
#define infile "rmq.in"
#define outfile "rmq.out"
#define nmax (100*1001)
#define lmax 17
int rmq[lmax][nmax]; //valorile range-ului
int lg[nmax]; //lg[i]=logaritm in baza 2 din i
int v[nmax]; //vectorul cu numerele
int n; //numarul de numere
int m; //numaru de query-uri

inline int min(int a, int b)
{
	if(a<b) return a; return b;
}

int query(int a, int b)
{
	int k=lg[b-a+1];
	return min(rmq[k][a],rmq[k][b-(1<<k)+1]);
}

void read()
{
	int i;
	scanf("%d %d\n",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d\n",&v[i]);
}

void init()
{
	int i,j;
	
	//facem vectorul logaritmilor
	for(i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
	
	//initializam rmq
	for(i=1;i<=n;i++)
		rmq[0][i]=v[i];
	
	//construim intreg rmq-ul
	for(i=1;(1<<i)<=n;i++)
		for(j=1;j+(1<<i)-1<=n;j++)
			rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}

void solve()
{
	int i,a,b;
	for(i=1;i<=m;i++)
	{
		scanf("%d %d\n",&a,&b);
		printf("%d\n",query(a,b));
	}
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}