Cod sursa(job #190104)

Utilizator wefgefAndrei Grigorean wefgef Data 19 mai 2008 23:28:46
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
// solutie proasta optimizata cu arbori de intervale
#include <fstream>
using namespace std;

#define p1 ((poz) * 2)
#define p2 ((poz) * 2 + 1)
#define mij (((st) + (dr)) / 2)

const int INF = 0x3f3f3f3f;
const int MAXN = 100005;
const int DMAX = 1;

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

int N, M;
int A[MAXN];
int AInt[1 << 17];

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); }
inline int max(int a, int b) { return (a > b ? a : b); }

void BuildAInt(int poz, int st, int dr) {
	if (dr - st <= DMAX) return;

	BuildAInt(p1, st, mij);
	BuildAInt(p2, mij+1, dr);

	AInt[poz] = min(AInt[p1], AInt[p2]);
}

int Query(int poz, int st, int dr, int a, int b) {
	if (dr - st <= DMAX) {
		int ret = INF;
		int start = max(a, st);
		int stop = min(b, dr);

		for (int i = start; i <= stop; ++i)
			ret = min(ret, A[i]);

		return ret;
	}

	int ret = INF;
	if (a <= mij) ret = min(ret, Query(p1, st, mij, a, b));
	if (b > mij) ret = min(ret, Query(p2, mij+1, dr, a, b));

	return ret;
}

int main() {
	ReadData();
	BuildAInt(1, 1, N);
	for (int op = 0; op < M; ++op) {
		int a, b;
		fin >> a >> b;
		fout << Query(1, 1, N, a, b) << endl;
	}
}