#include<iostream>
#include<algorithm>
using namespace std;
const int N=5000000;
int n,a[N+5],q;
struct node{
int l,r,mx,mn;
}tr[4*N+5];
void build(int p,int l,int r){
tr[p].l=l,tr[p].r=r;
if (l!=r){
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tr[p].mx=max(tr[p*2].mx,tr[p*2+1].mx),tr[p].mn=min(tr[p*2].mn,tr[p*2+1].mn);
} else tr[p].mx=a[l],tr[p].mn=a[l];
}
int queryx(int p,int l,int r){
if (l<=tr[p].l&&tr[p].r>=r) return tr[p].mx;
int mid=(tr[p].l+tr[p].r)>>1;
return max((l<=mid?queryx(p*2,l,r):0),(r>mid?queryx(p*2+1,l,r):0));
}
int queryn(int p,int l,int r){
if (l<=tr[p].l&&tr[p].r>=r) return tr[p].mn;
int mid=(tr[p].l+tr[p].r)>>1;
return min((l<=mid?queryn(p*2,l,r):0x7fffffff),(r>mid?queryn(p*2+1,l,r):0x7fffffff));
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>q;
for (int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while (q--){
int l,r;
cin>>l>>r;
cout<<queryx(1,l,r)-queryn(1,l,r)<<'\n';
}
return 0;
}
显示数组越界,不知道怎么回事。。。