Cod sursa(job #246287)

Utilizator scvalexAlexandru Scvortov scvalex Data 20 ianuarie 2009 16:02:40
Problema Range minimum query Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>

const int oo = 1<<30;

int a[100000], ms[1000];

int min(int a, int b) {
	if (a > b)
		return b;
	return a;
}

int main(int argc, char *argv[]) {
	int n, m, i, j, l, u, mn, c;

	FILE *fi = fopen("rmq.in", "r");	
	fscanf(fi, "%d %d", &n, &m);
	for (i = 0; i < n; ++i)
		fscanf(fi, "%d", a+i);

	for (mn = 0; mn*mn < n; ++mn)
		;
	--mn;

	for (i = 0; i*mn < n; ++i) {
		ms[i] = oo;
		for (j = i*mn; (j < (i+1)*mn) && (j < n); ++j)
			ms[i] = min(ms[i], a[j]);
	}
	
	/* for (i = 0; i < n; ++i)
		printf("%d ", a[i]);
	printf("\n");

	for (i = 0; i*mn < n; ++i)
		printf("%d ", ms[i]);
	printf("\n"); */

	FILE *fo = fopen("rmq.out", "w");
	while (m--) {
		fscanf(fi, "%d %d", &l, &u);
		--l, --u;

		/* printf("%d..%d: ", l, u); */
		c = oo;
		for (i = 0; i*mn < l; ++i)
			;
		for (j = l; j < i*mn; ++j) {
			c = min(c, a[j]);
			/* printf("%d ", a[j]); */
		}
		/* printf("| "); */
		for (; i*mn <= u; ++i) {
			c = min(c, ms[i]);
			/* printf("%d ", ms[i]); */
		}
		/* printf("| "); */
		for (j = i*mn; j <= u; ++j) {
			c = min(c, a[j]);
			/* printf("%d ", a[j]); */
		}

		fprintf(fo, "%d\n", c);
			
	}
	fclose(fo);
	fclose(fi);

	return 0;
}