#include <iostream>
#include <algorithm>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, q;
const int maxn = 100000;
int arbore[4*(maxn+1)];
int v[maxn+1];
void build( int left, int right, int node )
{
if( left == right ) /// am ajuns la o frunza fara urmas
{
arbore[node] = v[left];
//g << "am ajuns la capat " << v[left] << " " << node << "\n";
}
else
{
int middle = left + (right - left)/2;
//g << "interval " << left << " si " << middle << "\n";
//g << "interval " << middle+1 << " si " << right << "\n";
build( left, middle, node*2 );
build( middle+1, right, 2*node+1 );
arbore[node] = min( arbore[node*2], arbore[node*2+1] );
}
}
void update( int left, int right, int node, int position, int value )
{
if( left == right )
arbore[node] = value;
else
{
int middle = left + (right - left)/2;
if( position <= middle ) /// intram in intervalul din stanga
update( left, middle, node*2, position, value );
else
update( middle+1, right, node*2+1, position, value );
arbore[node] = min( arbore[node*2], arbore[node*2+1] );
}
}
int query( int left, int right, int node, int query_left, int query_right )
{
if( query_left <= left && right <= query_right )
return arbore[node];
else
{
int middle = left + (right - left)/2;
/*
* * * * * * * * * * * * *
| | |
{ }
*/
if( query_right <= middle )
return query( left, middle, node*2, query_left, query_right );
if( middle + 1 <= query_left )
return query( middle+1, right, node*2+1, query_left, query_right );
/*
* * * * * * * * * * * * *
| | |
{ }
*/
//int val = max( query( left, middle, node*2, query_left, query_right ), query( middle+1, right, node*2+1, query_left, query_right ));
//g << "pe " << left << " " << right << " avem " << val << "\n";
return min( query( left, middle, node*2, query_left, query_right ), query( middle+1, right, node*2+1, query_left, query_right ));
}
}
int main() {
ios_base::sync_with_stdio(false);
f.tie(nullptr);
g.tie(nullptr);
f >> n >> q;
for( int i = 1; i <= n; ++i )
{
f >> v[i];
}
build( 1, n, 1 );
for( int i = 1; i <= q; ++i )
{
int x, y;
f >> x >> y;
g << query( 1, n, 1, x, y ) << "\n";
}
return 0;
}