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;
}