Cod sursa(job #1046814)

Utilizator BuseSorinFMI Buse Sorin-Marian BuseSorin Data 3 decembrie 2013 16:34:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<iostream>
#include<fstream>
#include<math.h>
using namespace std;

const int MAXN = 100000;
const int LOGMAXN = 17;
int A[MAXN];
int M[MAXN][LOGMAXN];
double Log2(double n)
{ 
	return log(n) / log(2);
}
void preProcesare(int N)
{
	for (int i = 0; i < N; i++){
		M[i][0] = i;
	}
	for (int j = 1; 1 << j <= N; j++){
		for (int i = 0; i + (1 << j) - 1 < N; i++){
			if (A[M[i][j - 1]] < A[M[i + (1 << (j - 1))][j - 1]]){
				M[i][j] = M[i][j - 1];
			}
			else{
				M[i][j] = M[i + (1 << (j - 1))][j - 1];
			}
		}
	}
}
	

int main()
{
	ifstream f("rmq.in");
	ofstream o("rmq.out");
	int n = 0; int m = 0;
	f >> n >> m;
	
	for (int i = 0; i < n; i++){
		f >> A[i];
	}
	preProcesare(n);
	
	for (int i = 0; i < m; i++){
		int x, y;
		f >> x >> y;
		x--; y--;
		int k = Log2(y-x+1);
		int p = pow(2, k);
		if (A[M[x][k]] <= A[M[y - p+1][k]]){
			o << A[M[x][k]] << '\n';
		}
		else{
			o << A[M[y - p+1][k]] << '\n';
		}
	}
}