Cod sursa(job #509075)

Utilizator cosmyoPaunel Cosmin cosmyo Data 10 decembrie 2010 12:29:43
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100005;
int n, m, a[N][20], x[N], l[N], P[20];

int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	int p, i, j, k, X, Y;

	scanf("%d %d ", &n, &m);
 	
	for(i = 1; i <= n; ++i)
		scanf("%d", &x[i]);

	p = 1;
	k = -1;
		for(i = 1; i<= n; ++i) {
			if( i == p )
				++k, p*=2;
			
			if( i <= p ) 
				l[i] = k ;
			
		}
	P[0] = 1;
		for(i = 1; i <= 19; ++i)
			P[i] = P[i - 1] * 2;

		for(i = 1; i <= n; ++i)
			a[i][0] = x[i];

		for(j = 1; j <= l[n]; ++j)
			for(i = 1; i <= n; ++i)
				if( i + P[j] <= n + 1 )
					a[i][j] = min(a[i][j - 1], a[i + P[j - 1]][j - 1]);

		for(; m; --m) {
			scanf("%d %d", &i, &j);
			printf("%d \n", min(a[i][l[j-i+1]], a[j - P[l[j-i+1]]+1][l[j-i+1]] ) );
		}
	/*	for(i = 1; i <= n; ++i) {
			for( j = 0;j <= l[n]; ++j)
				printf("%d ",a[i][j]);
			printf("\n");
		}
    */		
	return 0;
}