Pagini recente » Cod sursa (job #3245619) | Cod sursa (job #275144) | Cod sursa (job #990876) | Cod sursa (job #2389644) | Cod sursa (job #872778)
Cod sursa(job #872778)
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 100001
#define maxlog 20
int n, v[maxn] ;
int m[maxlog][maxn] ;
int t, x, y ;
int log[maxn] ;
void precalc()
{
int num = 2 ;
int lg = 0 ;
log[1] = 0 ;
for(int i = 2; i <= maxn; ++i )
{
if( i == num )
{
num *= 2 ;
++ lg ;
}
log[i] = lg ;
}
}
int pow(int x, int y)
{
int r = 1 ;
for(int i = 1; i <= y; ++i )
r *= x ;
return r ;
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &n, &t);
for(int i = 1; i <= n; ++i )
{
scanf("%d", &v[i]);
m[1][i] = v[i] ;
}
int pas = 1 ;
int lin = 2 ;
while( 1 + pas <= n )
{
for(int i = 1; i <= n; ++i )
{
if( i + pas > n )
m[lin][i] = m[lin-1][i] ;
else
m[lin][i] = min( m[lin-1][i], m[lin-1][i+pas] ) ;
}
pas *= 2 ;
++lin ;
}
precalc() ;
++t ;
while( --t )
{
scanf("%d%d", &x, &y);
int dif = y - x ;
int val = pow ( 2, log[dif] ) ;
int rez = min( m[ log[dif] + 1 ][x], m[ log[dif] + 1 ][ y - val + 1 ] ) ;
printf("%d\n", rez);
}
return 0 ;
}