CSES - Shared codeLink to this code: https://cses.fi/paste/486e757d5d10a3dc4f6874/
#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
#define IOS ios_base::sync_with_stdio(0);  cin.tie(0); cout.tie(0);

typedef pair<int,int>pr;
#define all(i)     i.begin() , i.end()
#define ft     first
#define sn     second
#define pb push_back


#define en "\n"
#define dbg cout<<"rony\n";

#define MAXN 200010
#define inf 1e8
const int mod = 1e9+7;

int n,q;
int a[MAXN];

struct segmentTree
{
    struct node_maker
    {
        int mn,st,En;
        void initialize(int l,int r)
        {
            st = l, En = r;
           if(l == r){
          mn = a[l];
          }
        }
        
    }g[3*MAXN];

    void filling(node_maker &a,node_maker &b , node_maker &c)
    {
        a.mn = min(b.mn,c.mn);
    }

   void build(int cn,int l,int r)
   {
      g[cn].initialize(l,r);
      if(l == r) return;
      int md = l + ( r - l)/2;
      build(2*cn, l,md);
      build(2*cn + 1, md + 1 , r);
      
      filling(g[cn],g[cn*2],g[cn*2 + 1]);
   }

   int query(int cn,int l,int r)
   {
      int x = g[cn].st, y = g[cn].En;
      if(y < l || x > r) return INT_MAX;
      if(x >= l && y <= r){
        return g[cn].mn;
      }
      
      int A = query(cn*2,l,r);
      A = min(A,query(cn*2 + 1,l,r));
      return A;
   }
}stree;
void solve()
{
   cin >> n >> q;
   for(int i = 1;i <= n;i++) cin >> a[i];
   
   stree.build(1,1,n);
   
   while(q--)
   {
     int l,r;
     cin >> l >> r;
     int an = stree.query(1,l,r);
     cout<<an<<en;
   }
  
    
}
int main()
{
    IOS;
   int t;
   t = 1;
   
   //cin >> t;
   int c = 0;
    while ( t-- )
    {
        //cout<<"Case "<<++c<<": ";
        solve();
    }
    return 0;
}