Cod sursa(job #841941)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 25 decembrie 2012 17:00:40
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN	100001
#define MAXLOGN 18

int N,M,logN;

int Mat[MAXLOGN][MAXN];
int v[MAXN];
int lg[MAXN];

// min de indecsi
int min(int x,int y)
{
	if( v[x] < v[y] )
		return x;
	else
		return y;
}

int main(int argc, char* argv[])
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	scanf("%d %d",&N,&M);
	
	int i,j;
	lg[0] = -1;
	for(i=1;i<=N;i++){
		scanf("%d",&v[i]);
		Mat[0][i] = i;
		lg[i] = lg[i/2]+1;
	}
	
	logN = lg[N];
	int d=1;	
	for(j=1;j<=logN;j++){
		int pct = N-d;
		for(i=1;i<=pct;i++){
			Mat[j][i] = min( Mat[j-1][i], Mat[j-1][i+d] );
		}
		for(;i<=N;i++){
			Mat[j][i] = Mat[j-1][i];
		}
		d = d << 1;
	}
	
	
	int a,b;
	for(i=1;i<=M;i++){
		scanf("%d %d",&a,&b);
		printf("%d\n",v[min( Mat[lg[b-a+1]][a], Mat[lg[b-a+1]][b+1-(1<<lg[b-a+1])])]);
	}
	
	return 0;
}