#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
/// min-tree
const int nmax = 1e5+5;
const int inf = 1e6;
int t[4*nmax],lazy[4*nmax];
void update(int nod, int st, int en, int l, int r, int val)
{
if(lazy[nod])
{
t[nod]+=lazy[nod];
if(st!=en)
{
lazy[2*nod]+=lazy[nod];
lazy[2*nod+1]+=lazy[nod];
}
lazy[nod]=0;
}
if(st>r || en<l)
return;
if(st>=l && en<=r)
{
t[nod]+=val;
if(st!=en)
{
lazy[2*nod]+=val;
lazy[2*nod+1]+=val;
}
return;
}
int mid = (st+en)/2;
update(2*nod,st,mid,l,r,val);
update(2*nod+1,mid+1,en,l,r,val);
t[nod]=min(t[2*nod],t[2*nod+1]);
}
int get(int nod, int st, int en, int l, int r)
{
if(lazy[nod])
{
t[nod]+=lazy[nod];
if(st!=en)
{
lazy[2*nod]+=lazy[nod];
lazy[2*nod+1]+=lazy[nod];
}
lazy[nod]=0;
}
if(st>r || en<l)
return inf;
if(st>=l && en<=r)
return t[nod];
int mid=(st+en)/2;
return min(get(2*nod,st,mid,l,r),
get(2*nod+1,mid+1,en,l,r));
}
int main()
{
int n,m;
fin >> n >> m;
for(int i=1 ; i<=n ; ++i)
{
int x;
fin >> x;
update(1,1,n,i,i,x);
}
for(int i=1 ; i<=m ; ++i)
{
int a, b;
fin >> a >> b;
fout << get(1,1,n,a,b) << '\n';
}
return 0;
}