Cod sursa(job #179441)

Utilizator omu_salcamtache tudor omu_salcam Data 15 aprilie 2008 22:09:48
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<stdio.h>
#include<math.h>
FILE *f1,*f2;
int v[100111],ma[100111][18];
long p[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
long a,b,c,n,m,i,j,l;
int main(){
	f1=fopen("rmq.in","r");
	f2=fopen("rmq.out","w");
	fscanf(f1,"%ld%ld",&n,&m);
	for(i=1;i<=n;fscanf(f1,"%d",&v[i]),i++);
	for(i=0;i<=n;ma[i][0]=v[i],i++);
	for(i=n;i>0;i--){
		a=1;
		for(j=1;i+a<=n+1;j++){
			//a=pow(2,j-1);
			a=1<<(j-1);
			if(i+a<=n+1){
				ma[i][j]=ma[i+a][j-1];
				if(ma[i][j-1]<ma[i+a][j-1]){
					ma[i][j]=ma[i][j-1];
				}
			}
		}
	}
	for(i=1;i<=m;i++){
		fscanf(f1,"%ld%ld",&a,&b);
		l=0;
		c=b-a+1;
		while(p[l]<=c){
			l++;
		}
		l--;
		c=ma[a][l];
		if(ma[a][l]>ma[b-p[l]+1][l]){
			c=ma[b-p[l]+1][l];
		}
		fprintf(f2,"%ld\n",c);
//  min([x,y])=min(a[x][L],a[y-2^L+1][L])
	}
	return 0;
}