#include #include #define MAX_N 1000 #define MAX_LOG 10 #define min(x,y) ((x) < (y) ? (x) : (y)) int n, q, segSize, v[MAX_N], seg[MAX_LOG][MAX_N]; int log(int x) { return 31 - __builtin_clz(x); } int main(void) { FILE *f = fopen("rmq.in", "r"); fscanf(f, "%d %d\n", &n, &q); for (int i = 0; i < n; i++) { fscanf(f, "%d", &v[i]); } for (int i = 0; i < n; i++) { seg[0][i] = v[i]; } for (int i = 1; (1 << i) < n; i++) { for (int j = 0; j + (1 << i) <= n; j++) { seg[i][j] = min(seg[i - 1][j], seg[i - 1][j + (1 << (i - 1))]); } } for (int i = 0; i < q; i++) { int x, y; fscanf(f, "%d %d", &x, &y); int width = log(y - x + 1); int m = min(seg[width][x], seg[width][y - (1 << width) + 1]); printf("%d\n", m); } fclose(f); }