Cod sursa(job #248643)

Utilizator scvalexAlexandru Scvortov scvalex Data 26 ianuarie 2009 13:21:36
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>

int a[100000], ms[18][100000];

void buildMs(int a[], int n, int ms[18][100000]) {
	int i, j;

	for (i = 0; i < n; ++i)
		ms[0][i] = i;

	for (j = 1; (1<<j) < n; ++j)
		for (i = 0; i + (1<<j) - 1 < n; ++i) {
			if (a[ms[j-1][i]] < a[ms[j-1][i+(1<<(j-1))]])
				ms[j][i] = ms[j-1][i];
			else
				ms[j][i] = ms[j-1][i+(1<<(j-1))];
		}
}

int mlog2(int n) {
	int i = 0;
	for (; 1<<i <= n; ++i)
		;
	return (i-1);
}

int rmq(int a[], int n, int ms[18][100000], int l, int u) {
	int k = mlog2(u-l+1);

	if (a[ms[k][l]] < a[ms[k][u-(1<<k)+1]])
		return ms[k][l];
	return ms[k][u-(1<<k)+1];
}

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

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

	buildMs(a, n, ms);

	FILE *fo = fopen("rmq.out", "w");
	while (m--) {
		fscanf(fi, "%d %d", &l, &u);
		fprintf(fo, "%d\n", a[rmq(a, n, ms, l-1, u-1)]);
	}
	fclose(fo);
	fclose(fi);

	return 0;
}