Cod sursa(job #568917)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 31 martie 2011 20:11:35
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<cstdio>
#include<cmath>
#include<algorithm>
#define Nmax 100001
#define Lmax 17

using namespace std;

int N,M;

int d[Lmax][Nmax];

int main(){
	
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	
	for(int i=1;i<=N;++i)
		scanf("%d",&d[0][i]);
	
	for(int lung=1; 1<<lung <=N; lung++) // toate secventele de lungime 2^lung
		for(int start=1; start +(1<<(lung-1)) <= N; ++start) //ce incep din "start"
			
			d[lung][start] = min ( d[lung-1][start] , //lungime 2^lung/2 ce incepe din partea stanga
			                       d[lung-1][start + (1<< (lung-1))]);  //lungime 2^lung/2 ce se termina in partea dreapta
								   
	for(int i=1;i<=M;++i){
		int x,y;
		
		scanf("%d%d",&x,&y);
	
		int k = (int)log2(y-x+1); // cea mai mare lungime putere a lui 2 mai mica decat lungimea intervalului
		
		int sol = min ( d[k][x] ,  // lungime 2^k ce incepe din x
						d[k][y- (1<<k) +1] ); //lungimime 2^k ce se termina in y
						
		printf("%d\n",sol);
		
	}
	
	
	
return 0;
}