Cod sursa(job #1226062)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 4 septembrie 2014 15:14:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
using namespace std;
const int MAXN = 100000,LOGMAXN = 20;
int M[MAXN][LOGMAXN],A[100000],n;

void process(int N)
{
	int i, j;   
	for (i = 0; i < N; i++)
		M[i][0] = i;
	for (j = 1; 1 << j <= N; j++)
		for (i = 0; i + (1 << j) - 1 < N; i++)
			M[i][j] = A[M[i][j - 1]] < A[M[i + (1 << (j - 1))][j - 1]] ? M[i][j - 1] :  M[i + (1 << (j - 1))][j - 1];
}  
void rmq(int i, int j){
      int k = (int)(log10((double)(j - i + 1)) / log10(2.0));
      printf("%d\n",min(A[M[i][k]], A[M[j - (1 << k) + 1][k]]) ) ;
	
}
int main(){
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	int q;
	scanf("%d%d",&n,&q);
	for(int i = 0; i < n; i++)
		scanf("%d",&A[i]);
	process(n);
	for(int i = 0; i < q; i++){
		int s,t;
		scanf("%d%d",&s,&t);
		rmq(s - 1, t - 1);
	}
	return 0;
}