Cod sursa(job #1069789)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 30 decembrie 2013 15:00:11
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
#include <math.h> 
#include<algorithm>

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

void create(){
	
	
	
	for(int i =0 ;i<n;i++)p[i][0]=i;
	/*
	for(int i = 1 ;1<<i <= n;i++)
	  for(int j = 0 ;j+(1<<i)-1 < n;j++)
	  	if(a[p[j][i-1]]<a[p[j+(1<<(i-1))][i-1]])p[j][i]=p[j][i-1];
	  	else p[j][i]=p[j+(1<<(i-1))][i-1];
	*/
	for (int j = 1; 1 << j <= n; j++)
          for (int i = 0; i + (1 << j) - 1 < n; i++)
              if (a[p[i][j - 1]] < a[p[i + (1 << (j - 1))][j - 1]])
                  p[i][j] = p[i][j - 1];
              else
                  p[i][j] = p[i + (1 << (j - 1))][j - 1];
	  
}


int minim(int x,int y){
	x-=1;y-=1;
	int k;// = trunc(log);//log(y-x+1)
	for(k=1; 1<<k<=y-x+1;k++);k--;//return k;
	return min(a[p[x][k]],a[p[y-(1<<k)+1][k]]);
}

int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
//create();

	for(int i =0 ;i<n;i++)p[i][0]=i;
	/*
	for(int i = 1 ;1<<i <= n;i++)
	  for(int j = 0 ;j+(1<<i)-1 < n;j++)
	  	if(a[p[j][i-1]]<a[p[j+(1<<(i-1))][i-1]])p[j][i]=p[j][i-1];
	  	else p[j][i]=p[j+(1<<(i-1))][i-1];
	*/
	for (int j = 1; 1 << j <= n; j++)
          for (int i = 0; i + (1 << j) - 1 < n; i++)
              if (a[p[i][j - 1]] < a[p[i + (1 << (j - 1))][j - 1]])
                  p[i][j] = p[i][j - 1];
              else
                  p[i][j] = p[i + (1 << (j - 1))][j - 1];
                  
                  
                  
int x,y,k;
for(int i=1;i<=m;i++){
	scanf("%d %d",&x,&y);
	//	int k;// = trunc(log);//log(y-x+1)
	for(k=1; 1<<k<=y-x+1;k++);k--;//return k;
	//return min(a[p[x][k]],a[p[y-(1<<k)+1][k]]);
	printf("%d\n",min(a[p[x-1][k]],a[p[y-(1<<k)][k]]));
}

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