Cod sursa(job #1171680)

Utilizator stefynr8Space Monkey stefynr8 Data 16 aprilie 2014 03:00:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <cmath>
#define NMAX 100000

long N, M, A[NMAX], mat[NMAX][17];
long i,j,k, t;

using namespace std;

int main()
{

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

	scanf("%ld %ld", &N, &M);

	for(i=0 ; i <N ; i++)
		scanf("%ld", &A[i]);


	//initialize mat for the intervals with length 1
	for (i = 0; i < N; i++)
		mat[i][0] = i;

	//compute values from smaller to bigger intervals
	for(j = 1; 1 << j <= N; j++)
		for(i = 0; i + (1 << j) - 1 < N; i++){
/*			printf("compare: (%ld) %ld\t (%ld) %ld\t\t", 
				mat[i][j - 1], A[ mat[i][j - 1]] , 
				mat[i + (1 << (j - 1))][j - 1],  A[ mat[i + (1 << (j - 1))][j - 1]]);
*/
			if (A[ mat[i][j - 1]] < A[ mat[i + (1 << (j - 1))][j - 1]]){
				mat[i][j] = mat[i][j - 1];
//				printf(": %ld\n", mat[i][j]);
			}
			else{
				mat[i][j] = mat[i + (1 << (j - 1))][j - 1];
//				printf(": %ld\n", mat[i][j]);
			}
		}

/*
	for(i = 0 ; i < N ; i++){
		for(j = 0; j < log(N) / log(2); j++)
			printf("%ld ", mat[i][j]);
		printf("\n");
	}
*/

	//resolv query
	for(t=0 ; t<M ; t++){
		scanf("%ld %ld", &i, &j);
		i--;
		j--;

		k =(long) (log(j-i+1) / log(2) );
/*		
		printf("(%ld) %ld   (%ld) %ld\n", 
			mat[i][k], A[ mat[i][k]], mat[j - (1 << k) +1][k], A[mat[j - (1 << k) +1][k]]);
*/
		if(A[ mat[i][k]] <= A[mat[j - (1 << k) +1][k]] )
			printf("%ld\n", A[mat[i][k] ] );
		else
			printf("%ld\n", A[mat[j - (1 << k) +1][k] ]);
	}

	return 0;
}