// 题意: 给出一组数,输出区间最大值与最小值的差值
#include <iostream> // 线段树,求区间最值问题
using namespace std;
struct segment
{
int high,low; //记录该区间的最大值和最小值
}table[200000];
int arr[50005],MAX,MIN;
void built_tree(int n,int s,int t) //建树,其中第n个区间的范围是[s,t]
{
if(s==t)
table[n].high=table[n].low=arr[s];
else
{
int mid=(s+t)/2;
built_tree(2*n,s,mid);
built_tree(2*n+1,mid+1,t);
table[n].high=max(table[2*n].high,table[2*n+1].high);
table[n].low=min(table[2*n].low,table[2*n+1].low);
}
}
//要查询的范围是[head,end],当前搜索是在线段树第n个区间[s,t]
void range(int head,int end,int n,int s,int t)
{
if(head==s&&end==t)
{
MAX=max(MAX,table[n].high);
MIN=min(MIN,table[n].low);
}
else
{
int mid=(s+t)/2; //注意不要写成 int mid=(head+end)/2;
if(head<=mid)
range(head,min(mid,end),2*n,s,mid);
if(end>mid)
range(max(head,mid+1),end,2*n+1,mid+1,t);
}
}
int main()
{
int n,q,head,end;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i) //下标从1开始
scanf("%d",arr+i);
built_tree(1,1,n); //线段树第一个区间范围是[1,n]
while(q--)
{
scanf("%d%d",&head,&end);
MAX=0; MIN=1000001;
range(head,end,1,1,n);
printf("%d\n",MAX-MIN);
}
return 0;
}