#include using namespace std; const int INF = 10000000; template struct segment_tree{ int N; vector ST; function f; T E; segment_tree(vector A, function f, T E): f(f), E(E){ int n = A.size(); N = 1; while (N < n){ N *= 2; } ST = vector(N * 2 - 1, E); for (int i = 0; i < n; i++){ ST[N - 1 + i] = A[i]; } for (int i = N - 2; i >= 0; i--){ ST[i] = f(ST[i * 2 + 1], ST[i * 2 + 2]); } } T operator [](int k){ return ST[N - 1 + k]; } void update(int k, T x){ k += N - 1; ST[k] = x; while (k > 0){ k = (k - 1) / 2; ST[k] = f(ST[k * 2 + 1], ST[k * 2 + 2]); } } T query(int L, int R, int i, int l, int r){ if (r <= L || R <= l){ return E; } else if (L <= l && r <= R){ return ST[i]; } else { int m = (l + r) / 2; return f(query(L, R, i * 2 + 1, l, m), query(L, R, i * 2 + 2, m, r)); } } T query(int L, int R){ return query(L, R, 0, 0, N); } T all(){ return ST[0]; } }; int main(){ int N, Q; cin >> N >> Q; vector A(N); for (int i = 0; i < N; i++){ cin >> A[i]; A[i]--; } vector l(Q), r(Q); for (int i = 0; i < Q; i++){ cin >> l[i] >> r[i]; l[i]--; } auto op = [](array, 3> A, array, 3> B){ array, 3> C; for (int i = 0; i < 3; i++){ for (int j = i; j < 3; j++){ C[i][j] = INF; for (int k = i; k <= j; k++){ C[i][j] = min(C[i][j], A[i][k] + B[k][j]); } } } return C; }; array, 3> E = {{{0, INF, INF}, {INF, 0, INF}, {INF, INF, 0}}}; array, 3> LESS_THAN_OR_EQUAL = {{{-1, 1, -1}, {INF, 0, -1}, {INF, INF, -1}}}; array, 3> GREATER_THAN = {{{1, 1, 1}, {INF, 0, 1}, {INF, INF, 1}}}; vector> add(N); for (int i = 0; i < N; i++){ add[A[i]].push_back(i); } vector tv(Q, N), fv(Q, -1); while (true){ bool ok = true; vector> query(N); for (int i = 0; i < Q; i++){ if (tv[i] - fv[i] > 1){ ok = false; query[(tv[i] + fv[i]) / 2].push_back(i); } } if (ok){ break; } segment_tree, 3>> ST(vector, 3>>(N, GREATER_THAN), op, E); for (int i = 0; i < N; i++){ for (int j : add[i]){ ST.update(j, LESS_THAN_OR_EQUAL); } for (int j : query[i]){ array, 3> F = ST.query(l[j], r[j]); int res = min({F[0][0], F[0][1], F[0][2]}); if (res < 0){ tv[j] = i; } else { fv[j] = i; } } } } for (int i = 0; i < Q; i++){ cout << tv[i] + 1 << endl; } }