Cod sursa(job #248641)

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

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

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

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

	for (j = 1; (1<<j) < n; ++j)
		for (i = 0; i + (1<<j) - 1 < n; ++i) {
			if (a[ms[i][j-1]] < a[ms[i+(1<<(j-1))][j-1]])
				ms[i][j] = ms[i][j-1];
			else
				ms[i][j] = ms[i+(1<<(j-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[100000][18], int l, int u) {
	int k = mlog2(u-l+1);

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

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;
}