Pagini recente » Cod sursa (job #2273870) | Cod sursa (job #718295) | Cod sursa (job #1860597) | Cod sursa (job #1902107) | Cod sursa (job #1455081)
#include <stdio.h>
#define MAX 100005
#define min(x,y) (((x) < (y)) ? (x) :(y))
void constrRMQ(int rmq[][MAX], int n, int log);
int query(int rmq[][MAX], int log[], int x, int y);
int main(){
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m, i, x, y, rmq[18][MAX], log[MAX];
scanf("%d%d", &n, &m);
log[1] = 0;
for(i = 1; i <= n; i++){
scanf("%d", &rmq[0][i]);
log[i + 1] = log[(i + 1) / 2] + 1;
}
constrRMQ(rmq, n, log[n]);
for(i = 0; i < m; i++){
scanf("%d%d", &x, &y);
printf("%d\n", query(rmq, log, x, y));
}
return 0;
}
void constrRMQ(int rmq[][MAX], int n, int log){
int i, j;
for(i = 1; i <= log; i++)
for(j = 1; j <= n - (1<<i) + 1; j++)
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1<<(i - 1))]);
}
int query(int rmq[][MAX], int log[], int x, int y){
int d = log[y - x + 1];
return min(rmq[d][x], rmq[d][y - (1<<d) + 1]);
}