Cod sursa(job #1427488)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 2 mai 2015 13:16:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>
#include <cmath>

#define MaxN 100005
#define MaxLN 20

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int N, M, rmq[MaxN][MaxLN], minn, l ,r, v[MaxN], lg2[MaxN];

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

int main() {
	fin >> N >> M;
	
	for (int i = 1; i <= N; ++i) {
		fin >> rmq[i][0];
	}

	lg2[1] = 0;
	for (int i = 2; i <= N; ++i)
		lg2[i] = lg2[i / 2] + 1;

	for (int j = 1; (1 << j) <= N; ++j) {
		for (int i = 1; i + (1 << j) - 1 <= N; ++i) {
			int half = 1 << (j - 1);
			rmq[i][j] = min(rmq[i][j - 1], rmq[i + half][j - 1]);
		}
	}

	for (int i = 1; i <= M; ++i) {
		fin >> l >> r;
		int diff = r - l + 1;
		int l2 = lg2[diff];
		int offset = diff - (1 << l2);
		
		fout << min(rmq[l][l2], rmq[l + offset][l2]) << '\n';
	}

	return 0;
}