Cod sursa(job #382161)

Utilizator wefgefAndrei Grigorean wefgef Data 13 ianuarie 2010 03:07:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
using namespace std;

const int MAXN = 100005;
const int MAXLG = 17;
const int INF = 0x3f3f3f3f;

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

int N, M;
int A[MAXN];
int RMQ[MAXLG][MAXN];
int Lev[MAXN];

void ReadData() {
	fin >> N >> M;
	for (int i = 1; i <= N; ++i)
		fin >> A[i];
}

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

void BuildRMQ() {
	for (int i = 1; i <= N; ++i)
		RMQ[0][i] = A[i];

	for (int lev = 1; (1 << lev) <= N; ++lev)
		for (int i = 1; i <= N; ++i)
			RMQ[lev][i] = min(RMQ[lev-1][i], i + (1 << (lev-1)) <= N ? RMQ[lev-1][i + (1 << (lev-1))] : INF);
}

void BuildLev() {
	for (int pow = 1, lev = 0, i = 1; i <= N; ++i) {
		if ((pow << 1)== i) {
			++lev;
			pow <<= 1;
		}
		Lev[i] = lev;
	}
}

void WriteData() {
	for (int i = 0; i < M; ++i) {
		int a, b;
		fin >> a >> b;

		fout << min(RMQ[Lev[b-a]][a], RMQ[Lev[b-a]][b- (1 << (Lev[b-a])) + 1]) << "\n";
	}
}

int main() {
	ReadData();
	BuildRMQ();
	BuildLev();
	WriteData();
}