Cod sursa(job #1223764)

Utilizator sorin2kSorin Nutu sorin2k Data 28 august 2014 19:35:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<cstdio>
using namespace std;

int t[100000][20];

int log_2(int x) {
	int i = 0;
	while(x > 1) {
		i++;
		x /= 2;
	}
	return i;
}

int pow(int x) {
	int i = 1;
	while(x-- > 0) {
		i <<= 1;
	}
	return i;
}

int main() {
	int i, j, n, m, log, current = 1, u, v, ans;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(i = 0; i < n; i++) scanf("%d", &t[i][0]);
	log = log_2(n);
	for(j = 1; current <= n + 1; j++) {
		for(i = 0; i < n; i++) {
			if(i + current < n) {
				t[i][j] = (t[i][j-1] > t[i+current][j-1]) ? t[i+current][j-1] : t[i][j-1];
			} else {
				t[i][j] = t[i][j-1];
			}
		}
		current *= 2;
	}
	for(i = 0; i < m; i++) {
		scanf("%d %d", &u, &v);
		u--, v--;
		log = log_2(v - u);
		ans = t[v-pow(log)+1][log];
		if(ans > t[u][log]) ans = t[u][log];
		printf("%d\n", ans);
	}
	return 0;
}