Pagini recente » Borderou de evaluare (job #1967234) | Istoria paginii runda/round1/clasament | Cod sursa (job #2091833)
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define IN "rmq.in"
#define OUT "rmq.out"
int n , m;
int rmq[17][100003] , loga[100003];
void Read()
{
int i;
scanf ( "%d%d" , &n , &m );
for ( i = 1 ; i <= n ; i ++ )
scanf ( "%d" , &rmq[0][i]);
}
void Log()
{
int i;
loga[1] = 0;
for ( i = 2 ; i <= n ; i ++ )
loga[i] = loga[i/2]+1;
}
void RMQ()
{
Log();
int i , j , t;
t = loga[n];
for ( i = 1 ; i <= t ; i ++ )
for ( j = 1 ; j <= n ; j ++ )
if ( j+(1<<(i-1)) < n )
rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
/* for ( i = 0 ; i <= t ; i ++ ){
for ( j = 1 ; j <= n ; j ++ )
printf ( "%d " , rmq[i][j]);
printf ("\n");}
*/
}
void Solve()
{
int i , x , y , d;
for ( i = 1 ; i <= m ; i ++ ){
scanf ( "%d%d" , &x , &y );
d = loga[(x-y+1)];
printf ( "%d\n" , min(rmq[d][x],rmq[d][y-(1<<d)+1]));
}
}
int main()
{
freopen( IN , "r" , stdin );
freopen( OUT , "w" , stdout );
Log();
Read();
RMQ();
Solve();
}