Cod sursa(job #714054)

Utilizator DSzprogDombi Szabolcs DSzprog Data 15 martie 2012 12:25:26
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstring>
#include <cstdio>
#include <cmath>

#include <memory.h>

int n, m, l;
int heap[262144];

#define min(a, b) (a < b) ? a : b
#define minim(a) if (minimum > heap[a]) minimum = heap[a];

int level(int n) {
	int level = 1;
	while (n > level) {
		level *= 2;
	}
	return(level);
}

int minimum(int left, int right) {
	int minimum = 0x7F7F7F7F;
	while (left < right) {
		if (left % 2 == 0 && right % 2 == 1) {
			minim(left);
			minim(right);
			left /= 2;
			right /= 2;
		} else {
			if (left % 2) {
				minim(left);
				++left;
			} else {
				minim(right);
				--right;
			}
		}
	}
	minim(left);
	return(minimum);
}

int main() {
	memset(heap, 0x7F, 262144);
	FILE * in = fopen("rmq.in", "rt");
	FILE * out = fopen("rmq.out", "wt");

	fscanf(in, "%d%d", &n, &m);
	l = level(n);
	for (int i = 0; i < n; ++i) {
		fscanf(in, "%d", &heap[l + i]);
	}
	for (int i = l - 1; i > 0; --i) {
		heap[i] = min(heap[i * 2], heap[i * 2 + 1]);
	}

	int a, b;
	for (int i = 0; i < m; ++i) {
		fscanf(in, "%d%d", &a, &b);
		fprintf(out, "%d\n", minimum(l + a - 1, l + b - 1));
	}

	fclose(in);
	fclose(out);
}