Cod sursa(job #311777)

Utilizator socheoSorodoc Ionut socheo Data 4 mai 2009 08:56:46
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include<stdio.h>
#include<math.h>
int a[100001],rm[20][100001],i,n,m;
int min(int c,int v)
{ if(c<v)
	return c;
  return v;
	
}

void constr()
{ int l=1;
 for(i=1;(1<<i)<=n;i++)
    for(int j=1;j<=n-(1<<i)+1;j++)
	 {   rm[i][j]=min(rm[i-1][j],rm[i-1][j+l]);
		 l=1<<(i-1);
	}
}
void query(int q,int w)
{  int d=w-q+1;
   int t=int(log2(d));
   int p=int(pow(2,t));
   printf("%d\n",min(rm[t][q],rm[t][w-p+1]));
}
int main()
{ freopen("rmq.in","r",stdin);
  freopen("rmq.out","w",stdout);
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
	{  scanf("%d",&a[i]);
      rm[0][i]=a[i];
	}
  constr();
  for(i=1;i<=m;i++)
	{   int x,y; 
		scanf("%d%d",&x,&y);
	   query(x,y);
	}
	return 0;
}