Cod sursa(job #1248972)

Utilizator silidragosSilion Dragos silidragos Data 26 octombrie 2014 12:10:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<iostream>
#include<fstream>

using namespace std;

const int nmax = 100002;
const int lmax = 18;

long int n,m;
long int a[nmax];
long int lg[nmax];
long int M[lmax][nmax];

long int minim(long int a, long int b){
	return ((a < b) ? a : b);
}

int main(){
	ifstream f("rmq.in", ios::in);
	ofstream g("rmq.out", ios::out);

	long int i, j, l;
	f >> n >> m;

	for (int i = 1; i <= n; i++)
		f >> a[i];

	lg[1] = 0;
	for (i = 2; i <= n; i++)
		lg[i] = lg[i / 2] + 1;

	for (i = 1; i <= n; i++)
		M[0][i] = a[i];

	for (i = 1;(1<<i)<=n;i++)
	for (j = 0; j + (1 << i) - 1 <= n;j++){
		if (M[i - 1][j] < M[i - 1][j +(1 << (i- 1))]){
			M[i][j] = M[i-1][j];
		}
		else{
			M[i][j] = M[i-1][j+(1<<(i-1))];
		}
	}

	long int x, y;
	for (i = 0; i < m; i++){
		f >> x >> y;

		l = lg[y - x + 1];
		g << minim(M[l][x],M[l][y+1 - (1<<l)])<<'\n';
	}


	f.close();
	g.close();
	return 0;
}