Cod sursa(job #2303204)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 15 decembrie 2018 20:19:20
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 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];
	int min2=MINI[j-p/2+1][l-1];
	if(V[min1]<V[min2])
		return min1;
	else
		return min2;	
}

int main(){
	
	freopen("rmq.in", "r", stdin);
	//freopen("rmq_test7.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 nbline=1;
	int x,y,min;
	for(int i=0;i<M;i++){
		scanf("%d %d",&x,&y);
		if(nbline==30563){
			nbline=nbline;
		}
		min=findmin(x-1,y-1);
		printf("%d\n",V[min]);
		nbline++;
	}
	
	return 0;
}