//用线段树维护区间最大值和最小值。建树复杂性:O(logN), 查询复杂性:O(Q*logN)
#include <iostream>
using namespace std;
const int MAXN = 50010;
int MX[4*MAXN], MI[4*MAXN], A[MAXN];
int N, Q;
void init()
{
int i;
scanf("%d%d", &N, &Q);
for (i=1; i<=N; i++)
scanf("%d", &A[i]);
}
void build(int i, int b, int e)
{
if (b==e)
{
MX[i] = b;
MI[i] = b;
return;
}
build(2*i, b, (b+e)/2);
build(2*i+1, (b+e)/2+1, e);
if (A[MX[2*i]] >= A[MX[2*i+1]])
MX[i] = MX[2*i];
else
MX[i] = MX[2*i+1];
if (A[MI[2*i]] <= A[MI[2*i+1]])
MI[i] = MI[2*i];
else
MI[i] = MI[2*i+1];
}
int Q1(int i, int b, int e, int j, int k)
{
int p1, p2;
if (j>e || k<b) return -1;
if (j<=b && e<=k) return MX[i];
p1 = Q1(2*i, b, (b+e)/2, j, k);
p2 = Q1(2*i+1, (b+e)/2+1, e, j, k);
if (p1 == -1) return p2;
if (p2 == -1) return p1;
if (A[p1]>=A[p2]) return p1;
return p2;
}
int Q2(int i, int b, int e, int j, int k)
{
int p1, p2;
if (j>e || k<b) return -1;
if (j<=b && e<=k) return MI[i];
p1 = Q2(2*i, b, (b+e)/2, j, k);
p2 = Q2(2*i+1, (b+e)/2+1, e, j, k);
if (p1 == -1) return p2;
if (p2 == -1) return p1;
if (A[p1]<=A[p2]) return p1;
return p2;
}
int main()
{
int i, j, k, h1, h2,ans;
init();
build(1, 1, N);
for (i=1; i<=Q; i++)
{
scanf("%d%d", &j, &k);
h1 = Q1(1, 1, N, j, k);
h2 = Q2(1, 1, N, j, k);
printf("%d/n", A[h1] - A[h2]);
}
return 0;
}