Cod sursa(job #916000)

Utilizator b_ady20Branescu Adrian b_ady20 Data 15 martie 2013 18:14:56
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<cstdio>
#define min(a,b) (a)<=(b)?(a):(b)
using namespace std;
int v[100001];
int log[100001];
int mat[100001][25];
int main(){
	int i,n,m,j,x,y,p;
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		scanf("%d",v+i);
	for(i=0;i<=n;++i)
		mat[i][0]=i;
	for(j=1;1<<j<=n;++j)
		for(i=0;i+(1<<j)-1<=n;++i)
			if(v[mat[i][j-1]]<v[mat[i+(1<<(j-1))][j-1]])
				mat[i][j]=mat[i][j-1];
			else
				mat[i][j]=mat[i+(1<<(j-1))][j-1];
	log[0]=0;
	p=1;
	for(i=1;i<=n;++i)
		if(p*2<=i) log[i]=log[i-1]+1,p*=2;
		else log[i]=log[i-1];
	for(i=0;i<m;++i){
		scanf("%d%d",&x,&y);
		p=log[y-x+1];
		printf("%d\n",min(v[mat[x][p]],v[mat[y-(1<<p)+1][p]]));
	}
	//hoteluri.. infoarena!
	return 0;
}