#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
int N,Q;
int a[50005];
int Bleng[50005];///记录属于哪一个块
int l[50005];///记录每块左右区间的下标
int r[50005];
int mmin[50005],mmax[50005];///记录最大值和最小值
int main()
{
while(~scanf("%d %d",&N,&Q))
{
for(int i=1; i<=N; i++)
{
scanf("%d",&a[i]);
}
int block=sqrt(N);
int num=N/block;
if(N%block!=0)
num++;
for(int i=1; i<=N; i++)
{
Bleng[i]=(i-1)/block+1;
}
for(int i=1; i<=num; i++)
{
l[i]=(i-1)*block+1;
r[i]=block*i;
}
for(int i=1; i<=num; i++)
{
mmin[i]=inf,mmax[i]=0;
for(int j=l[i]; j<=r[i]; j++)
{
if(a[j]>mmax[i])
mmax[i]=a[j];
if(a[j]<mmin[i])
mmin[i]=a[j];
}
}
for(int i=1; i<=Q; i++)
{
int L,R;
scanf("%d %d",&L,&R);
int minn=inf,maxn=0;
if(Bleng[L]==Bleng[R])
{
for(int i=L; i<=R; i++)
{
if(a[i]>maxn)
maxn=a[i];
if(a[i]<minn)
minn=a[i];
}
}
else
{
for(int i=Bleng[L]+1; i<=Bleng[R]-1; i++)
{
if(mmax[i]>maxn)
maxn=mmax[i];
if(mmin[i]<minn)
minn=mmin[i];
}
for(int i=L;i<=r[Bleng[L]];i++)
{
if(a[i]>maxn)
maxn=a[i];
if(a[i]<minn)
minn=a[i];
}
for(int i=l[Bleng[R]];i<=R;i++)
{
if(a[i]>maxn)
maxn=a[i];
if(a[i]<minn)
minn=a[i];
}
}
printf("%d\n",maxn-minn);
}
}
}