Cod sursa(job #163119)

Utilizator andrei.12Andrei Parvu andrei.12 Data 21 martie 2008 14:47:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include<stdio.h>

int v, i, j, m, n, x, y, lg, pt[20], a[20][100001];
inline int min(int a, int b){
	if (a < b)
		return a;
	return b;
}
int main()
{
	freopen("rmq.in", "rt", stdin);
	freopen("rmq.out", "wt", stdout);
	
	scanf("%d%d", &n, &m);
	for (i = 1; i <= n; i ++){
		scanf("%d", &v);
		
		a[0][i] = v;
	}
	
	pt[0] = 1;
	for (i = 1; i < 18; i ++)
		pt[i] = 2*pt[i-1];
	
	for (i = 0; pt[i] < n; i ++)
		for (j = 1; j <= n; j ++)
			a[i+1][j] = min(a[i][j], a[i][j + pt[i]]);
	
	for (i = 1; i <= m; i ++){
		scanf("%d%d", &x, &y);
		
		lg = y-x+1;
		
		for (j = 17; j >= 0; j --)
			if (pt[j] <= lg)
				break;
		
		printf("%d\n", min(a[j][x], a[j][y-pt[j]+1]));
	}
	
	return 0;
}