Cod sursa(job #2369221)

Utilizator copanelTudor Roman copanel Data 5 martie 2019 21:48:25
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.77 kb
#include <stdio.h>

#define MAXN 100000
#define MAXK 17

#define MIN(a, b) ((a) < (b) ? (a) : (b))

int rmq[MAXN][MAXK + 1];
int logv[MAXN + 1];

int main() {
	FILE *fin = fopen("rmq.in", "r"),
		 *fout = fopen("rmq.out", "w");
	int n, m, i, j;
	int l, r;

	logv[1] = 0;
	for (i = 2; i <= MAXN; i++) {
		logv[i] = logv[i >> 1] + 1;
	}

	fscanf(fin, "%d%d", &n, &m);
	for (i = 0; i < n; i++) {
		fscanf(fin, "%d", &rmq[i][0]);
	}

	for (j = 1; j <= logv[n] + 1; j++) {
		for (i = 0; i + (1 << j) <= n; i++) {
			rmq[i][j] = MIN(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
		}
	}

	for (i = 0; i < m; i++) {
		fscanf(fin, "%d%d", &l, &r);
		l--; r--;
		j = logv[r - l + 1];
		fprintf(fout, "%d\n", MIN(rmq[l][j], rmq[r - (1 << j) + 1][j]));
	}
	fclose(fin);
	fclose(fout);
	return 0;
}