Pagini recente » Cod sursa (job #79096) | Cod sursa (job #2221779) | Cod sursa (job #695464) | Cod sursa (job #3198019) | Cod sursa (job #478435)
Cod sursa(job #478435)
#include<stdio.h>
const int N=100002, M=21;
int n, m, min[N][M];
inline int Minim( int a, int b)
{
return (a<b ? a:b);
}
void Read()
{
scanf( "%d%d", &n, &m);
for( int i=1; i<=n; ++i)
scanf( "%d", &min[i][0]);
}
void Precalculation()
{
int PowMax=1;
while( (1<<PowMax+1)<n )
PowMax++;
for( int i=1; i<=PowMax; ++i)
for( int j=1; j<=(n-(1<<i)+1); ++j)
min[j][i] = Minim( min[j][i-1], min[ j + (1<<(i-1)) ][i-1]);
}
inline int GetPow(int a)
{
int PowMax=0;
while( (1<<(PowMax+1))<=a )
PowMax++;
return PowMax;
}
void Respond()
{
int a, b, PowMax;
while(m--)
{
scanf( "%d%d", &a, &b);
PowMax=GetPow(b-a);
printf( "%d\n", Minim( min[a][PowMax], min[b-(1<<PowMax)+1][PowMax]));
}
}
int main()
{
freopen( "rmq.in", "r", stdin);
freopen( "rmq.out", "w", stdout);
Read();
Precalculation();
Respond();
return 0;
}