#include #include #define MAX_N 1000 #define MAX_SQRT_N 32 #define min(x,y) ((x) < (y) ? (x) : (y)) int n, q, segSize, v[MAX_N], seg[MAX_SQRT_N]; 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]); } segSize = sqrt(n); // This could be optimized to avoid the modulo calculation, but is left as it is for readability for (int i = 0; i < n; i++) { if (i % segSize == 0) { seg[i / segSize] = v[i]; } else { seg[i / segSize] = min(seg[i / segSize], v[i]); } } for (int i = 0; i < q; i++) { int x, y; fscanf(f, "%d %d", &x, &y); // This could be optimized to avoid the modulo calculation, but is left as it is for readability int m = v[x]; int j = x + 1; while (j <= y) { if ((j % segSize == 0) && (j + segSize <= y + 1)) { m = min(m, seg[j / segSize]); j += segSize; } else { m = min(m, v[j]); j++; } } printf("%d\n", m); } fclose(f); }