Cod sursa(job #690098)

Utilizator deividFlorentin Dumitru deivid Data 25 februarie 2012 10:50:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>

#define maxn 100005
#define maxlog 18

FILE*f=fopen("rmq.in","r");
FILE*g=fopen("rmq.out","w");

int n,q;
int E[maxn],Rmq[maxlog][maxn];

inline int min ( int a , int b ){
	return a <= b ? a : b;
}

inline void build_rmq () {
	
	for ( int i = 2 ; i <= n ; ++i ){
		E[i] = E[i>>1] + 1;
	}
	
	for ( int p = 1 ; p <= E[n] ; ++p ){
		for ( int i = 1 ; i + (1<<p) - 1 <= n ; ++i ){
			Rmq[p][i] = min(Rmq[p-1][i],Rmq[p-1][i+(1<<(p-1))]);
		}
	}
}

inline int get_min ( int x , int y ) {
	
	int e = E[y-x+1];
	
	int rez = min(Rmq[e][x],Rmq[e][y-(1<<e)+1]);
	
	return rez;
}

int main () {
	
	fscanf(f,"%d %d",&n,&q);
	
	for ( int i = 1 ; i <= n ; ++i ){
		int x;
		fscanf(f,"%d",&x);
		Rmq[0][i] = x;
	}
	
	build_rmq();
	
	for ( int i = 1 ; i <= q ; ++i ){
		int x,y;
		fscanf(f,"%d %d",&x,&y);
		fprintf(g,"%d\n",get_min(x,y));
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}