Pagini recente » Cod sursa (job #2219974) | Istoria paginii utilizator/ucv_barbulescu_dobre_feraru | Cod sursa (job #315475) | Cod sursa (job #161390) | Cod sursa (job #648532)
Cod sursa(job #648532)
#include<stdio.h>
int minim( const int &a, const int &b) {
if( a < b) return a;
return b;
}
int m[100001][20];
int lg[100001];
int main() {
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,mm;
scanf("%d %d",&n, &mm);
for( int i = 1; i <= n; ++i)
scanf("%d", &m[i][0]);
int k = 1;
for( int j = 1; k < n; j++, k = k << 1) {
for( int i = 1; i <= n; ++i) {
m[ i ][ j] = m[i][j-1];
if( i + k <= n && m[ i + k ][ j - 1] < m[i][j] )
m[i][j] = m[i+k][j-1];
}
}
lg[1] = 0;k = 1;
for( int i = 2; i <=n;++i){
if( i == (1<<k)) k++;
lg[i] = k - 1;
}
for( int i = 1; i <= mm; ++i) {
int a,b;
scanf("%d %d", &a, &b);
int dist = b - a + 1;
int llg = lg[dist];
printf("%d\n", minim( m[a][llg], m[ b - (1 << llg) + 1][llg]));
}
return 0;
}