Cod sursa(job #1088906)

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

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

	for (i=2; i<=n; ++i)
		lg[i]=lg[i/2]+1;

	for (i=1; i<=n; ++i)
		RMQ[i][0]=A[i];

	for (i=1; i<=n; ++i)
		for (j=1; (1<<j)<=n; ++j)
			RMQ[i][j]=INF;

	for (j=1; (1<<j)<=n; ++j)
		for (i=0; i+(1<<j)-1<=n; ++i)
			RMQ[i][j]=min(RMQ[i][j-1], RMQ[i+(1<<(j-1))][j-1]);

	for (i=1; i<=m; ++i)
	{
		scanf("%d%d",&x,&y);
		diff=y-x+1;
		k=lg[diff];
		printf("%d\n", min(RMQ[x][k], RMQ[y-(1<<k)+1][k]) );
	}

	return 0;
}