#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5;
ll n,q,a[maxn],max_tree[maxn<<8],min_tree[maxn<<8];
void build(ll o,ll l,ll r){
if(l==r){
max_tree[o]=min_tree[o]=a[l];
return ;
}
else if(l>r)return ;
ll mid=l+r>>1;
build(o*2,l,mid);
build(o*2+1,mid+1,r);
max_tree[o]=max(max_tree[o*2],max_tree[o*2+1]);
min_tree[o]=min(min_tree[o*2],min_tree[o*2+1]);
}
ll max_find(ll o,ll l,ll r,ll L,ll R){
if(L<=l&&r<=R)return max_tree[o];
else if(L>r||l>R)return -(maxn<<8);
ll mid=l+r>>1;
return max(max_find(o*2,l,mid,L,R),max_find(o*2+1,mid+1,r,L,R));
}
ll min_find(ll o,ll l,ll r,ll L,ll R){
if(L<=l&&r<=R)return min_tree[o];
else if(L>r||l>R)return maxn<<8;
ll mid=l+r>>1;
return min(min_find(o*2,l,mid,L,R),min_find(o*2+1,mid+1,r,L,R));
}
int main(){
scanf("%lld%lld",&n,&q);
for(ll i=1;i<=n;i++)scanf("%lld",a+i);
for(ll i=1;i<=n*16;i++)min_tree[i]=1e10;
build(1,1,n);
while(q--){
ll A,B;
scanf("%lld%lld",&A,&B);
printf("%lld\n",max_find(1,1,n,A,B)-min_find(1,1,n,A,B));
}
return 0;
}
显然,这是线段树 深进中这是优化技巧的题,为什么