#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 50010 int n , q; int h[MAXN]; struct Node{ int l; int r; int minNum; int maxNum; } tr[4*MAXN]; void build(int l,int r,int u){ tr[u].l=l; tr[u].r=r; if(l==r) { tr[u].minNum=h[l]; tr[u].maxNum=h[l]; return; } int mid=l+r>>1; build(l ,mid,u<<1); build(mid+1,r,u<<1|1); tr[u].minNum=min(tr[u<<1].minNum,tr[(u<<1)+1].minNum); tr[u].maxNum=max(tr[u<<1].maxNum,tr[(u<<1)+1].maxNum); } //查询最大值 int queryMax(int l,int r,int u){ if(tr[u].l==l&&tr[u].r==r) return tr[u].maxNum; int mid=tr[u].l+tr[u].r>>1; if(r<=mid) return queryMax(l,r,u<<1); else if(l>mid) return queryMax(l,r,u<<1|1); else return max(queryMax(l,mid,u<<1),queryMax(mid+1,r,(u<<1)+1)); } //查询最小值 int queryMin(int l,int r,int u) { if(tr[u].l==l&&tr[u].r==r) return tr[u].minNum; int mid=tr[u].l+tr[u].r>>1; if(r<=mid) return queryMin(l,r,u<<1); else if(l>mid) return queryMin(l ,r,u<<1|1); else return min(queryMin(l,mid,u<<1),queryMin(mid+1,r,(u<<1)+1)); } int main(){ while(scanf("%d%d",&n,&q)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&h[i]); build(1,n,1); int l,r; for(int i=0;i<q;i++){ scanf("%d%d",&l,&r); cout<<queryMax(l,r,1)-queryMin(l,r,1)<<endl; } } return 0; }