Pagini recente » Cod sursa (job #2905939) | Cod sursa (job #246254) | Cod sursa (job #1150876) | Cod sursa (job #754120) | Cod sursa (job #1223764)
#include<cstdio>
using namespace std;
int t[100000][20];
int log_2(int x) {
int i = 0;
while(x > 1) {
i++;
x /= 2;
}
return i;
}
int pow(int x) {
int i = 1;
while(x-- > 0) {
i <<= 1;
}
return i;
}
int main() {
int i, j, n, m, log, current = 1, u, v, ans;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 0; i < n; i++) scanf("%d", &t[i][0]);
log = log_2(n);
for(j = 1; current <= n + 1; j++) {
for(i = 0; i < n; i++) {
if(i + current < n) {
t[i][j] = (t[i][j-1] > t[i+current][j-1]) ? t[i+current][j-1] : t[i][j-1];
} else {
t[i][j] = t[i][j-1];
}
}
current *= 2;
}
for(i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
u--, v--;
log = log_2(v - u);
ans = t[v-pow(log)+1][log];
if(ans > t[u][log]) ans = t[u][log];
printf("%d\n", ans);
}
return 0;
}