Pagini recente » Borderou de evaluare (job #103639) | Cod sursa (job #251152) | Cod sursa (job #1212748) | Cod sursa (job #1203847) | Cod sursa (job #1220112)
#include <fstream>
#include <algorithm>
#include <cmath>
#define MAXN 100009
#define LOGN 20
using namespace std;
ofstream out("rmq.out");
ifstream in("rmq.in");
int n , m , dp[MAXN][LOGN];
void read();
void RMQ();
void wrs();
int main()
{
read();
RMQ();
/*
for( int i=1 ; i<=n ;++i )
{
for( int j = 0; j<=n ; ++j )
out << dp[i][j] << " ";
out << '\n';
}
*/
wrs();
return 0;
}
void read()
{
in >> n >> m;
for( int i = 1 ; i <=n ; ++i )
{
int x;
in >> x;
dp[i][0] = x; //initializare
}
}
void RMQ()
{
//a[i][j] - reprezinta un interval care incepe de pe pozitia i si are lungimea 2 ^ j .
int k = 0 ;
while( ( 1 << k ) <= n )
++k;
--k;
for( int j = 1 ; j <=k ; ++j )
{
for( int i=1 ; i<=n ; i++)
{
dp[i][j] = dp[i][j-1];
if( i + ( 1 << ( j - 1 ) ) <=n ) // ma incadrez in interval
dp[i][j] = min ( dp[i][j] , dp[ i + ( 1 << ( j - 1 ) ) ][ j - 1 ]);
}
}
}
void wrs()
{
for( int i , j ; m ; --m )
{
in >> i >> j;
if( i == j )
out << dp[i][0] << '\n';
else
{
int k = floor( log( j - i )/ log(2) );
out << min ( dp[i][k] , dp[ j - ( 1 << k ) + 1 ][k] ) << '\n';
}
}
}