Cod sursa(job #1472193)

Utilizator valentin50517Vozian Valentin valentin50517 Data 16 august 2015 16:10:02
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <fstream>
#include <cmath>
#define mini(x,y) ((x == 0 || x > y) && y != 0) ? y : x
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int N,M,R[100001][16],x,y;
int log2s(int n){
	return trunc(log2(n*1.0));
}
int query(int l,int r){
	return mini(R[l][log2s(r-l+1)] , R[r-(1<<log2s(r-l+1))+1][log2s(r-l+1)]);
}
int main(){
	fin >> N >> M;
	for(int i = 0;i<N;i++) fin >> R[i][0];
	
	for(int k = 1;k<=log2s(N);k++)
		for(int i = 0;i<N;i++){
			if( i+(1<<k)-1 < N )
				R[i][k] = mini(R[i][k-1],R[i+(1<<k-1)][k-1]);	
		}
	for(int k = 0;k<=log2s(N);k++){
		for(int i = 0;i<N;i++)	fout << R[i][k] << ' ';
		fout << '\n';
	}
	
	for(int i = 0;i<M;i++){
		fin >> x >> y;
		fout << query(x-1,y-1) << '\n';
	}
	return 0;
}