Cod sursa(job #158200)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 13 martie 2008 15:22:26
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
//rmq
# include <stdio.h>

# define nmax 100001
# define FIN "rmq.in"
# define FOUT "rmq.out"

long M[18][nmax],A[nmax],n,m,i,j,k,log[nmax],x,y;

int main()
{
 freopen(FIN,"r",stdin);
 freopen(FOUT,"w",stdout);
 
 scanf("%ld %ld",&n,&m);
 
 for (i=1; i<=n; i++)
   {
    scanf("%ld",&A[i]);
    M[0][i]=A[i];
   }
   
 log[1]=0;
 for (i=2; i<=n; i++)
   log[i]=log[i >> 1] + 1;
 
 for (i=1; (1 << i)<=n; i++)
   for (j=1; j+(1 << i)-1<=n; j++)
     if (M[i-1][j]<M[i-1][j+(1 << (i-1))])
       M[i][j]=M[i-1][j];
     else
       M[i][j]=M[i-1][j+ (1 << (i-1))];
   
 for (i=1; i<=m; i++)
   {
    scanf("%ld %ld",&x,&y);
    k=log[y-x+1];
    if (M[k][x]<M[k][y- (1 << k)+1])
      printf("%ld\n",M[k][x]);
    else
      printf("%ld\n",M[k][y-(1 << k)+1]);
   }
 return 0;
}