大意略。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 50010;
const int maxd = 17; // log10(50010) / log10(2);
int n, m;
int A[maxn];
int minv[maxn][maxd], maxv[maxn][maxd];
void RMQ_init()
{
for(int i = 1; i <= n; i++)
{
minv[i][0] = A[i];
maxv[i][0] = A[i];
}
for(int j = 1; (1<<j) <= n; j++)
{
for(int i = 1 ; i+(1<<j)-1 <= n; i++)
{
minv[i][j] = min(minv[i][j-1], minv[i+(1<<(j-1))][j-1]);
maxv[i][j] = max(maxv[i][j-1], maxv[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ(int L, int R)
{
int k = 0;
while(1<<(k+1) <= R-L+1) k++;
int a = min(minv[L][k], minv[R-(1<<k)+1][k]);
int b = max(maxv[L][k], maxv[R-(1<<k)+1][k]);
return b-a;
}
void read_case()
{
for(int i = 1; i <= n; i++) scanf("%d", &A[i]);
RMQ_init();
}
void solve()
{
read_case();
while(m--)
{
int L, R;
scanf("%d%d", &L, &R);
int ans = RMQ(L, R);
printf("%d\n", ans);
}
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
solve();
}
return 0;
}