Cod sursa(job #2303176)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 15 decembrie 2018 19:26:23
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>

#include<iostream>
#include<fstream>

using namespace std;

#define MAXN 100000

#define MAXLOGN 17

int M,N;
int V[MAXN];

int MINI[MAXN][MAXLOGN];

void buildtable(){
	for(int i=0;i<N;i++)
		MINI[i][0]=i;

	int l=0,p=1;
	while(p<N){
		p*=2;
		l++;
	}

	int min1,min2;
	p=1;
	for(int j=1;j<=l;j++){
		p*=2;
		for(int i=0;i<N;i++){
			min1=MINI[i][j-1];
			if((i+p/2)<N){
				min2=MINI[i+p/2][j-1];
				if(V[min1]<V[min2])
					MINI[i][j]=min1;
				else
					MINI[i][j]=min2;
			}
			else
				MINI[i][j]=min1;
		}
	}
}

int findmin(int i,int j){
	int l=0,p=1;
	while((i+p-1)<=j){
		l++;
		p*=2;
	}
	int min1=MINI[i][l-1];
	if((i+p/2)<=j){
		int min2=findmin(i+p/2,j);
		if(V[min1]<V[min2])
			return min1;
		else
			return min2;	
	}
	else
		return min1;
}

int main(){
	
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	scanf("%d %d", &N,&M);

	for(int i=0;i<N;i++)
		scanf("%d", &V[i]);

	buildtable();

	int x,y,min;
	for(int i=0;i<M;i++){
		scanf("%d %d",&x,&y);
		min=findmin(x-1,y-1);
		printf("%d\n",V[min]);
	}
	
	return 0;
}