Cod sursa(job #408013)

Utilizator dexter_dexMutascu Adrian - Dragos dexter_dex Data 2 martie 2010 19:49:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <stdio.h>
#include <algorithm>

#define Nmax 100005

using namespace std;

int n, m, i, j, k, x, y;
int A[17][Nmax], log[Nmax];

FILE * f = fopen ("rmq.in", "r");
FILE * g = fopen ("rmq.out", "w");

void citire(){
	fscanf (f, "%d %d", &n, &m);
	for (i = 1 ; i <= n ; i++)
		fscanf (f, "%d", &A[0][i]);
}

void preprocesare(){
	for (k = 1 ; (1<<k) <= n ; k++)
		for (i = 1 ; i + (1<<k) - 1 <= n ; i++)
			A[k][i] = min( A[ k-1 ][ i ], A[ k-1 ][ i+(1 << (k-1)) ] );	
}

void logaritm (){
	for (i = 2 ; i <= n ; i++)
		log[i] = log[i>>1] + 1;
}

void rezolvare(){
	for (i = 1 ; i <= m ; i++){
		fscanf (f, "%d %d", &x, &y);
		j = log[y-x+1];
		fprintf (g, "%d\n", min(A[j][x], A[j][y - (1<<j) + 1]));
	}
}

int main(){
	citire();
	preprocesare();
	logaritm();
	rezolvare();
	
	fclose(f);
	fclose(g);
	return 0;
}