Cod sursa(job #1903308)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 5 martie 2017 09:34:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>

namespace Var {
	FILE *fin, *fout;
	int N, M;
	int *v, **m;
	int *lg;
};
inline int mi(int x, int y) {
	using namespace Var;
	return (v[x] < v[y] ? x : y);
}

void citire() {
	using namespace Var;
	fscanf(fin, "%d%d", &N, &M);
	
	v = new int[N];
	for (int i = 0; i < N; ++i) {
		fscanf(fin, "%d", v + i);
	}
}
void pre_rmq() {
	using namespace Var;
	// Calculam logaritmii
	lg = new int[N + 1];
	lg[1] = 0;
	for (int i = 2; i <= N; ++i) {
		lg[i] = 1 + lg[i / 2];
	}
	// Facem matricea
	m = new int*[lg[N] + 1];
	for (int i = 0; i <= lg[N]; ++i) {
		m[i] = new int[N];
	}
	for (int i = 0; i < N; ++i) {
		m[0][i] = i;
	}
	for (int i = 1; i <= lg[N]; ++i) {
		for (int j = 0; j < N; ++j) {
			if (j + (1 << (i - 1)) < N) {
				m[i][j] = mi(m[i-1][j], m[i-1][j + (1 << (i-1))]);
			} else {
				m[i][j] = m[i-1][j];
			}
		}
	}
}
int rmq(int l, int r) {
	using namespace Var;
	return mi(m[lg[r - l + 1]][l], m[lg[r - l + 1]][r - (1 << lg[r - l + 1]) + 1]);
}
void afisare() {
	using namespace Var;
	for (int i = 0; i < M; ++i) {
		int x, y;
		fscanf(fin, "%d%d", &x, &y);
		int loc = rmq(x - 1, y - 1);
		fprintf(fout, "%d\n", v[loc]);
	}
}

int main()
{
	using namespace Var;
	fin = fopen("rmq.in", "r");
	fout = fopen("rmq.out", "w");
	
	citire();
	pre_rmq();
	afisare();
	
	fclose(fin);
	fclose(fout);
	return 0;
}