#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 3;
int n, q;
int read()
{
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getchar();
}
while(ch <= '9' && ch >= '0')
x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x * f;
}
struct tree
{
int l, r, minn, maxx;
}tr[N];
#define ls(x) x << 1
#define rs(x) x << 1 | 1
void push_up(int p)
{
tr[p].maxx = max(tr[ls(p)].maxx, tr[rs(p)].maxx);
tr[p].minn = min(tr[ls(p)].minn, tr[rs(p)].minn);
}
void build(int p, int l, int r)
{
tr[p].l = l, tr[p].r = r;
if(l == r)
{
tr[p].maxx = tr[p].minn = read(); return;
}
int mid = l + r >> 1;
build(ls(p), l, mid), build(rs(p), mid + 1, r);
push_up(p);
}
int query_min(int p, int l, int r)
{
if(l <= tr[p].l && tr[p].r <= r) return tr[p].minn;
int mid = tr[p].l + tr[p].r >> 1, ans = 1e9+7;
if(l <= mid) ans = min(ans, query_min(ls(p), l ,r));
if(r > mid) ans = min(ans, query_min(rs(p), l, r));
return ans;
}
int query_max(int p, int l, int r)
{
if(l <= tr[p].l && tr[p].r <= r) return tr[p].maxx;
int mid = tr[p].l + tr[p].r >> 1, ans = -1;
if(l <= mid) ans = max(ans, query_max(ls(p), l, r));
if(r > mid) ans = max(ans, query_max(rs(p), l, r));
return ans;
}
void ansprint(int x, int y)
{
printf("%d\n", query_max(1, x, y) - query_min(1, x, y));
}
int main()
{
n = read(), q = read();
build(1, 1, n);
while(q --)
ansprint(read(), read());
return 0;
}