#include using namespace std; const int N = 200010, M = 20; int w[N]; // 原始数组 int f[N][M], g[N][M]; // 最大值结果数组,最小值结果数组 int n, q; /* 输入样例: 6 3 1 7 3 4 2 5 1 5 4 6 2 2 答案: 6 3 0 */ // 预处理最大值 void rmqMax() { for (int j = 0; j < M; j++) // 注意是j在外层,类似于区间DP,长度在外层 for (int i = 1; i + (1 << j) - 1 <= n; i++) // i(行)在内层 if (j == 0) // base case 边界值 f[i][j] = w[i]; else f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]); } // 查询区间最大值 int queryMax(int l, int r) { int len = r - l + 1; int k = log2(len); return max(f[l][k], f[r - (1 << k) + 1][k]); } // 预处理最小值 void rmqMin() { for (int j = 0; j < M; j++) // 注意是j在外层,类似于区间DP,长度在外层 for (int i = 1; i + (1 << j) - 1 <= n; i++) // i(行)在内层 if (j == 0) // base case 边界值 g[i][j] = w[i]; else g[i][j] = min(g[i][j - 1], g[i + (1 << j - 1)][j - 1]); } // 查询区间最小值 int queryMin(int l, int r) { int len = r - l + 1; int k = log2(len); return min(g[l][k], g[r - (1 << k) + 1][k]); } int main() { // 加快读入 ios::sync_with_stdio(false), cin.tie(0); cin >> n >> q; for (int i = 1; i <= n; i++) cin >> w[i]; rmqMax(); // ST表初始化 rmqMin(); // ST表初始化 while (q--) { int l, r; cin >> l >> r; printf("%d\n", queryMax(l, r) - queryMin(l, r)); } return 0; }