Link to this code:
https://cses.fi/paste/259df9bdca1b7471c0daf2//* 777 */
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
using vi = vector <int>;
using vii = vector <vi>;
using pii = pair<int,int>;
using vpii = vector<pii>;
using mii = map<int,int>;
#define pb push_back
#define eb emplace_back
#define all(x) x.begin(),x.end()
#define sortf(x) sort(all(x))
#define sortr(x) sort(all(x),greater<int>())
// const int MOD=1e9+7;
// const int INF=1e9;
const int INF = LLONG_MAX;
vi vec;
// vpii vecp;
// const int N=1e6;
int n;
int res = 0;
void pre(){
}
class SegmentTree {
vector<int> tree;
public:
SegmentTree(vi& arr) {
int N = arr.size();
tree.resize(4 * N);
build(arr, 0, 0, N - 1);
}
int merge(int a,int b) {
return min(a, b);
}
int build(vector<int>& arr, int node, int low, int high) {
int mid = ((high - low) >> 1) + low;
if (low == high) {
tree[node] = arr[mid];
} else {
int leftSubtree = build(arr, (node << 1) + 1, low, mid);
int rightSubtree = build(arr, (node << 1) + 2, mid + 1, high);
tree[node] = merge(leftSubtree, rightSubtree);
}
return tree[node];
}
int query(int node, int low, int high, int left, int right) {
// no overlap (fully outiside query)
if (high < left || right < low) {
return INF;
}
// complete overlap (fully inside query)
if (left <= low && high <= right) {
return tree[node];
}
// partially overlap
int mid = ((high - low) >> 1) + low;
int leftSubtree = query((node << 1) + 1, low, mid, left, right);
int rightSubtree = query((node << 1) + 2, mid + 1, high, left, right);
return merge(leftSubtree, rightSubtree);
}
void printRanges(int node,int low,int high) {
cout << "node " << node << " => range [" << low << ", " << high << "], value = " << tree[node] << endl;
if (low == high) {
return;
}
int mid = ((high - low) >> 1) + low;
printRanges((node << 1) + 1, low, mid);
printRanges((node << 1) + 2, mid + 1, high);
}
};
void solve(){
int queries;
cin>>n>>queries;
vec.resize(n);
for(auto &x:vec)cin>>x;
SegmentTree segTree(vec);
// segTree.printRanges(0, 0, n-1);
while(queries--) {
int left,right;cin>>left>>right;
res = segTree.query(0, 0, n - 1, left - 1, right - 1);
cout << res << endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
pre();
solve();
}