模板题
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int N=50010;
int a[N], dpMax[N][30], dpMin[N][30];
//查询数组a的[l,r]区间的最值
int RMQ(int l, int r)
{
// int k = (int)(log(r - l + 1.0) / log(2.0));
int k=(int)(log((double)(r-l+1))/log(2.0));
int Max = max(dpMax[l][k], dpMax[r-(1<<k)+1][k]);
int Min = min(dpMin[l][k], dpMin[r-(1<<k)+1][k]);
return Max-Min;
}
int main()
{
int n, q, l, r;
scanf("%d%d", &n, &q);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
//ST
for(int i=1; i<=n; i++){
dpMax[i][0] = dpMin[i][0]=a[i];
}
for(int j=1; (1<<j)<=n; j++){
for(int i=1; i+(1<<j)-1<=n; i++){
dpMax[i][j] = max(dpMax[i][j-1], dpMax[i+(1<<(j-1))][j-1]);
dpMin[i][j] = min(dpMin[i][j-1], dpMin[i+(1<<(j-1))][j-1]);
}
}
while(q--){
scanf("%d%d", &l, &r);
printf("%d\n", RMQ(l, r));
}
return 0;
}