Cod sursa(job #1640291)

Utilizator AlexandraaaaMereu Alexandra Alexandraaaa Data 8 martie 2016 16:50:51
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <string>
#define maxN 100000

using namespace std;

int M[maxN][30];

int log(int n){
	int a = 0, b = 1;
	while ((b << 1) <= n){
		a++;
		b <<= 1;
	}
	return a;
}

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

	int n, m;
	f >> n >> m;
	for (int i = 1; i <= n; ++i){
		int x;
		f >> x;
		M[i][0] = x;
	}

	int lim = log(n);
	for (int j = 1; j <= lim; j++){
		int a = 1 << (j - 1);
		for (int i = 1; i + a - 1 <= n; ++i){
			if (M[i][j - 1] <= M[i + a - 1][j - 1])
				M[i][j] = M[i][j - 1];
			else
				M[i][j] = M[i + a - 1][j - 1];
		}
	}

	for (int i = 0; i < m; ++i){
		int l, r;
		f >> l >> r;
		int a = log(l - r + 1);
		if (M[l][a] < M[r - (1 << a) + 1][a])
			g << M[l][a] << "\n";
		else
			g << M[r - (1 << a) + 1][a] << "\n";
	}

	f.close();
	g.close();

	return 0;
}