#include<bits/stdc++.h>
using namespace std;
struct t{
int Max=0,Min=INT_MAX;
}tree[200001];
int n,q;
int a[50001];
void pushup(int x){
tree[x].Max=max(tree[x*2].Max,tree[x*2+1].Max);
tree[x].Min=min(tree[x*2].Min,tree[x*2+1].Min);
}
void build(int index,int l,int r){
if(l==r){
tree[index].Max=a[l];
tree[index].Min=a[l];
return ;
}
int mid=(l+r)/2;
build(index*2,l,mid);
build(index*2+1,mid+1,r);
pushup(index);
}
int query_max(int index,int l,int r,int x,int y){
if(x<=l && y>=r){
return tree[index].Max;
}
int mid=(l+r)/2,ret=0;
if(x<=mid){
ret=max(ret,query_max(index*2,l,mid,x,y));
}
if(y>mid){
ret=max(ret,query_max(index*2+1,mid+1,r,x,y));
}
return ret;
}
int query_min(int index,int l,int r,int x,int y){
if(x<=l && y>=r){
return tree[index].Min;
}
int mid=(l+r)/2,ret=INT_MAX;
if(x<=mid){
ret=min(ret,query_min(index*2,l,mid,x,y));
}
if(y>mid){
ret=min(ret,query_min(index*2+1,mid+1,r,x,y));
}
return ret;
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
cout<<query_max(1,1,n,x,y)-query_min(1,1,n,x,y)<<endl;
}
return 0;
}