Link to this code: https://cses.fi/paste/8dec275c1d00b6f1d76ad4/
/* 777 */
#include <bits/stdc++.h>
using namespace std;

const int INF = INT_MAX;

int highestPowerOf2(uint32_t x) {
    return 31 - __builtin_clz(x);
}

class SparseTable {
    int N, L;
    vector<vector<int>> table;

   public:
    SparseTable(int n) {
        this->N = n;
        this->L = highestPowerOf2(n) + 1;
        this->table.resize(n, vector<int>(this->L, INF));
    }

    void build(vector<int>& arr) {
        for (int i = 0; i < N; ++i) {
            table[i][0] = arr[i];
        }
        for (int k = 1; k < L; ++k) {
            for (int i = 0; i < N - (1 << k) + 1; ++i) {
                table[i][k] = min(table[i][k - 1], table[i + (1 << (k - 1))][k - 1]);
            }
        }
    }

    int query(int l, int r) {
        int k = highestPowerOf2(r - l + 1);
        return min(table[l][k], table[r - (1 << k) + 1][k]);
    }
};

void solve() {
    int N, Q;
    cin >> N >> Q;
    vector<int> arr(N);
    for (int& x : arr) cin >> x;
    SparseTable* st = new SparseTable(N);
    st->build(arr);
    vector<int> qs(Q);
    for (int q = 0; q < Q; ++q) {
        int l, r;
        cin >> l >> r;
        // int res = st.query(l, r); // 1 - based
        int res = st->query(l - 1, r - 1);  // 0-based
        qs[q] = res;
    }
    for (int q : qs) cout << q << '\n';
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--) solve();
}