Pagini recente » Cod sursa (job #693710) | Cod sursa (job #1085053) | Cod sursa (job #341379) | Cod sursa (job #2743243) | Cod sursa (job #2481438)
#include <cstdio>
#include <algorithm>
const int NMAX = 100000;
const int LMAX = 18;
int RMQ[LMAX + 1][NMAX + 1];
int V[NMAX + 1];
int lg[NMAX + 1];
int main()
{
freopen("rmq.in" , "r" , stdin);
freopen("rmq.out" , "w" , stdout);
int n , No_Of_Queries , l;
scanf("%d%d" , &n ,&No_Of_Queries);
for(register int i = 1; i <= n ; i ++)
{
scanf("%d" , &V[i]);
RMQ[0][i] = V[i];
}
/// Precalculez Log2(i)
lg[1] = 0;
lg[1] = 0;
for(register int i = 2; i <= n ; i ++)
{
lg[i] = lg[i / 2] + 1;
}
/// Generez matricea RMQ
for(register int i = 1; (1 << i) <= n ; i ++)
{
for(register int j = 1; j <= n - (1 << i) + 1 ; j ++)
{
l = 1 << (i - 1);
RMQ[ i ][ j ] = std :: min( RMQ[ i - 1][ j ] , RMQ[ i - 1][ j + l]);
}
}
/// Raspund la intrebari
for(register int Query = 1 ; Query <= No_Of_Queries ; Query ++ )
{
int x , y;
scanf("%d%d" , &x , &y);
int dif = y - x + 1;
l = lg[dif];
int sh = dif - (1 << l);
printf("%d\n" , std :: min(RMQ[ l ][ x ] , RMQ[ l ][ x + sh]));
}
return 0;
}