Cod sursa(job #401995)

Utilizator dexter_dexMutascu Adrian - Dragos dexter_dex Data 23 februarie 2010 12:00:37
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>
#include <algorithm>

#define Nmax 100005

using namespace std;

int n, m, i, k, q, x, y, sol;
int a[17][Nmax], v[Nmax], log[Nmax];


void preprocesare(){
	
	for (i = 1 ; i <= n ; i++)
		a[0][i] = v[i];
	for (k = 1 ; 1 << k <= n ; k++)
		for (i = 1 ; i <= n - (1<<k) + 1 ; i++)
			a[k][i] = min(a[k-1][i], a[k-1][i + (1<<(k-1))]);
		
	for (i = 2 ; i <= n ; i++)
		log[i] = log[i/2] + 1;

}


int main (){
	
	
	FILE * f = fopen ("rmq.in", "r");
	FILE * g = fopen ("rmq.out", "w");
	
	fscanf (f, "%d %d", &n, &m);
	for (i = 1 ; i <= n ; i++)
		fscanf (f, "%d", &v[i]);
	
	preprocesare();
	
	for (i = 1  ; i <= m ; i++){
		sol = Nmax;
		fscanf(f, "%d %d", &x, &y);
		q = log [y - x];
		for (k = x ; k <= y - (1<<q) + 1 ; k++)
			if (sol > a[q][k])
				sol = a[q][k];
		fprintf (g, "%d\n", sol);
	}
	
	
	fclose(f);
	fclose(g);
	return 0;
}