Pagini recente » preONI 2005 runda #2 - solutii | Cod sursa (job #280167) | Cod sursa (job #2971856) | Cod sursa (job #2157890) | Cod sursa (job #156076)
Cod sursa(job #156076)
#include <cstdio>
const long MAX = 100010;
const long LG_MAX = 20;
long A[LG_MAX][MAX];
long LG[MAX];
long n,m,i,j,k;
inline long min(long a, long b) { return a<b?a:b; }
inline void rmq_build() {
for (i=1; i<=n; ++i)
scanf("%ld", A[0]+i);
for (j=1,k=1; j<=n; j<<=1,++k)
for (i=1; i<=n; ++i)
A[k][i] = min(A[k-1][i], A[k-1][i+j]);
}
inline long rmq_query(long x, long y) {
long dif = y-x+1;
long lg = LG[dif];
long p = 1<<lg;
return min(A[lg][x], A[lg][y-p+1]);
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%ld %ld", &n, &m);
for (i=2; i<=n; ++i)
LG[i] = LG[i>>1] + 1;
rmq_build();
while (m--) {
long a,b;
scanf("%ld %ld", &a, &b);
long r = rmq_query(a,b);
printf("%ld\n", r);
}
return 0;
}