Cod sursa(job #247845)

Utilizator scvalexAlexandru Scvortov scvalex Data 24 ianuarie 2009 11:11:54
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

int a[100000];
int ma[100000][18];

void buildM(int a[], int n, int m[100000][18]) {
	int i, j;

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

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

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

	if (a[m[l][k]] < a[m[u-(1<<k)][k]])
		return m[l][k];
	return m[u-(1<<k)][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);

	buildM(a, n, ma);

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

	return 0;
}