Pagini recente » Cod sursa (job #1720527) | Cod sursa (job #1847590) | Cod sursa (job #3217191) | Cod sursa (job #827651) | Cod sursa (job #1673180)
#include <cstdio>
#define DIM 100005
#define DIMlg 18
using namespace std;
int rmq[DIMlg][DIM];
int log[DIM];
int minim( int a, int b );
void precalculare_log( int n );
void precalculare_rmq( int n );
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n, m, i, j, s, t, d, k, p, q;
scanf("%d%d",&n,&m);
for( i = 1; i <= n; ++i )
scanf("%d",&rmq[0][i]);
precalculare_log( n );
precalculare_rmq( n );
for( i = 1; i <= m; ++i ){
scanf("%d%d",&p,&q);
d = log[q-p+1];
printf("%d\n",minim( rmq[d][p], rmq[d][q-(1<<d)+1]));
}
return 0;
}
int minim( int a, int b ){
if( a > b ) return b;
return a;
}
/**Precalculare valori logaritmi de intervale*/
void precalculare_log( int n ){
int i;
log[1] = 0;
for( i = 2; i <= n; ++i ){
log[i] = log[i/2] + 1;
}
}
/**Precalculam rmq pentru puterile lui 2*/
void precalculare_rmq( int n ){
int i, j, p;
for( i = 1; (1<<i) <= n; ++i ){
for( j = 1; j + (1<<i) - 1 <= n; ++j ){
p = 1<<(i-1);
rmq[i][j] = minim( rmq[i-1][j], rmq[i-1][j+p] );
}
}
}