Cod sursa(job #1069788)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 30 decembrie 2013 14:58:43
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <math.h> 
const int inf = 1000000000;

using namespace std;
const int  nmax = 103000;
int n,m,a[nmax],p[nmax],nr;

void create(){
	int min=inf,nm=1,i=1;
	while(i<=n){
	
		if(min>a[i])min=a[i];
	if(i%nr == 0 || i==n){
		p[nm]=min;
		nm++;
		min=inf;
	}	
		i++;
	}		
	}
	
	int minim(int x,int y){
	int ic,sf,min=inf;
	
	if(y-x<nr || (y-x==nr && (y%nr!=0) && 0)){
		for(int i=x;i<=y;i++)if(min>a[i])min=a[i];return min;
	}
	 

		//if(y-x==nr && (y%nr==0))return p[y/nr];
	 
	 
	 sf=y/nr;ic=x/nr+2;
	 if(((x-1)%nr==0 && x!=1) || x%nr==0)ic=x/nr+1;
		
		for(int i=ic;i<=sf;i++)
		  if(min>p[i])min=p[i];
	
	for(int i=x;i<=nr*ic-nr;i++) if(min>a[i])min=a[i];
	for(int i=nr*sf+1;i<=y;i++) if(min>a[i])min=a[i];
		  
		  return min;
	}


int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
nr=trunc(sqrt(n));
create();
//printf("%d\n",minim(3,5));
//for(int i=1;i<=n/nr+1;i++)printf("%d ",p[i]);

int x,y;
for(int i=1;i<=m;i++){
	scanf("%d %d",&x,&y);
	printf("%d\n",minim(x,y));
}

fclose(stdout); fclose(stdin);
return 0;
}