%%%JSB
随机一般有什么用呢?即: 对于一个点 i,然后从 1 到 i 递增的数列长度是 log。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
inline void read(ll &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=500005;
namespace BIT{
#define lowbit(i) ((i)&-(i))
ll c[N]; int maxn;
inline void init(int n){
maxn=n; for (int i=1;i<=n;i++) c[i]=1LL<<61;
}
inline void add(int x,ll r){
x=maxn-x+1;
for (int i=x;i<=maxn && c[i]>r;i+=lowbit(i))
c[i]=r;
}
inline ll query(int x,int y){
x=maxn-x+1; y=maxn-y+1;
ll ret=1LL<<61;
for (int i=x;i>=y;i-=lowbit(i))
ret=min(ret,c[i]);
return ret;
}
}
struct event{
int l,r,idx;
bool operator < (const event &B)const{
return r<B.r;
}
}eve[N];
int n,m;
ll a[N],ans[N];
int Q[N],l,r;
int small[N],big[N],F[N][40],G[N][40];
void Small(int x,int y){
F[x][++F[x][0]]=y;
for (int i=1;i<=G[y][0];i++)
if (a[G[y][i]]<a[x]) return Small(x,G[y][i]);
}
int Big(int x,int y){
G[x][++G[x][0]]=y;
for (int i=1;i<=F[y][0];i++)
if (a[F[y][i]]>a[x]) return Big(x,F[y][i]);
}
inline void Solve(){
l=1; r=0;
for (int i=1;i<=n;i++){
while (l<=r && a[i]<=a[Q[r]]) r--;
if (l<=r) small[i]=Q[r];
Q[++r]=i;
}
l=1; r=0;
for (int i=1;i<=n;i++){
while (l<=r && a[i]>=a[Q[r]]) r--;
if (l<=r) big[i]=Q[r];
Q[++r]=i;
}
BIT::init(n);
for (int i=1;i<=n;i++){
if (small[i]) Small(i,small[i]);
if (big[i]) Big(i,big[i]);
// if (*F[i]) check(F[i][*F[i]],i);
// if (*G[i]) check(G[i][*G[i]],i);
}
int pnt=1;
for (int i=1;i<=n;i++){
for (int k=1;k<=F[i][0];k++)
BIT::add(F[i][k],a[i]-a[F[i][k]]);
for (int k=1;k<=G[i][0];k++)
BIT::add(G[i][k],a[G[i][k]]-a[i]);
while (pnt<=m && eve[pnt].r==i)
ans[eve[pnt].idx]=BIT::query(eve[pnt].l,i),pnt++;
}
}
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
read(n);read(m);
for (int i=1;i<=n;i++) read(a[i]);
for (int i=1;i<=m;i++)
read(eve[i].l),read(eve[i].r),eve[i].idx=i;
sort(eve+1,eve+m+1);
Solve();
for (int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}