Cod sursa(job #591830)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 25 mai 2011 18:03:43
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
/* avem un sir in care trebuie sa aflam minimul din mai multe subsiruri.
ex : v={1 2 3 4 5}, aflam min dp poz 1-3 si e v[1]=1; min dp poz 3-5: 3;
*/
#include<stdio.h>
#include<math.h>
int a[101][101],i,j,lg[101],n,p,d,x,y,k;
int main(){
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d", &n,&k); //n=lung vector
	for(i=1;i<=n;++i) scanf("%d", &a[0][i]);
	for(i=2;i<=n;++i) lg[i]=lg[i/2]+1; //calculare logaritmi in baza 2 pentru nr.
	p=2;
	for(i=1;i<=lg[n];++i){
		for(j=1;j<=n-p+1;++j){
			if(a[i-1][j]<a[i-1][j+p/2]) a[i][j]=a[i-1][j];
			else a[i][j]=a[i-1][j+p/2]; //sa creat matricea.
		}
		p*=2;
	}
	for(i=1;i<=k;++i){
		scanf("%d%d", &x, &y);
		d=y-x+1; p=1;
		//printf("%d\n", max(a[lg[d]][x], a[lg[d]][x+d-pow(2,lg[d]));
		for(j=1;j<=lg[d];++j) p*=2;
		if(a[lg[d]][x]< a[lg[d]][x+d-p])
			printf("%d\n", a[lg[d]][x]);
		else printf("%d\n", a[lg[d]][x+d-p]);
	}
	return 0;
}