Cod sursa(job #1088894)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 20 ianuarie 2014 22:15:58
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int n,m;
int A[MAXN],M[MAXN][18],lg[MAXN];
int main()
{
	int i,j,x,y,k;
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);

	for (i=0; i<n; ++i)
		scanf("%d",&A[i]);

	lg[1]=0;
	for (i=2; i<=n; ++i)
	{
		lg[i]=lg[i>>1]+1;
	}



	for (i=0; i<n; ++i)
		M[i][0]=i;

	for (j=1; (1<<j)<=n; ++j)
	{
		for (i=0; i+(1<<j)-1<n; ++i)
		{
			if (A[M[i][j-1]]<A[M[i+(1<<(j-1))][j-1]])
				M[i][j]=M[i][j-1];
			else
				M[i][j]=M[i+(1<<(j-1))][j-1];
		}
	}



	int diff,logaritm,rmq;
	for (i=1; i<=m; ++i)
	{
		rmq=0;
		scanf("%d%d",&x,&y);
		diff=y-x;
		k=lg[diff];

		if (A[M[x][k]]<A[M[y-(1<<k)+1][k]])
			rmq=M[x][k];
		else
			rmq=M[y-(1<<k)+1][k];
		printf("%d\n",rmq);
	}
	return 0;
}