#include <stdio.h>
#define Nadejde 131072
int N, M, pos, val;
int tree[2 * Nadejde];
int a, b, min;
/** max(X, Y). **/
inline int MIN(int X, int Y) {
return X < Y ? X : Y;
}
/** Updateaza arborele in nodul "node" -> [left, right], pentru pozitia "pos" si valoarea "val". **/
inline void update(int node, int left, int right) {
if (left == right) {
tree[node] = val;
return;
}
int mid = (left + right) >> 1;
if (pos <= mid) {
update(2 * node, left, mid);
} else {
update(2 * node + 1, mid + 1, right);
}
tree[node] = MIN(tree[2 * node], tree[2 * node + 1]);
}
/** Obtine o informatie din nodul "node" -> [left, right], pentru intervalul [a, b]. **/
inline void query(int node, int left, int right) {
if ((a <= left) && (right <= b)) {
min = MIN(min, tree[node]);
return;
}
int mid = (left + right) >> 1;
if (a <= mid) {
query(2 * node, left, mid);
}
if (b > mid) {
query(2 * node + 1, mid + 1, right);
}
}
int main(void) {
int i;
FILE *f = fopen("rmq.in", "r");
/* Citirea datelor si construirea arborelui. */
fscanf(f, "%d %d", &N, &M);
for (i = 1; i <= N; i++) {
fscanf(f, "%d", &val);
pos = i;
update(1, 1, N);
}
/* Citirea intrebarilor si afisarea raspunsurilor. */
freopen("rmq.out", "w", stdout);
while (M) {
fscanf(f, "%d %d", &a, &b);
min = Nadejde;
query(1, 1, N);
fprintf(stdout, "%d\n", min);
M--;
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}