求区间最大值和最小值的差,直接用ST表水过去了. hh
#include <iostream>
using namespace std;
const int N = 50010, M = 16;
int n, w[N], f1[N][M], f2[N][M], g[N];
void init()
{
g[0] = -1;
for (int i = 1; i <= n; i++) {
g[i] = g[i / 2] + 1;
f1[i][0] = f2[i][0] = w[i];
}
for (int j = 1; j < M; j++) {
for (int i = 1; i + (1 << j) - 1 < N; i++) {
f1[i][j] = max(f1[i][j - 1], f1[i + (1 << j - 1)][j - 1]);
f2[i][j] = min(f2[i][j - 1], f2[i + (1 << j - 1)][j - 1]);
}
}
}
int query (int l, int r)
{
int k = g[r - l + 1];
return max(f1[l][k], f1[r - (1 << k) + 1][k]) - min(f2[l][k], f2[r - (1 << k) + 1][k]);
}
void solve()
{
int m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> w[i];
init();
while (m--)
{
int l, r;
cin >> l >> r;
cout << query (l, r) << endl;
}
}
int main()
{
ios::sync_with_stdio(0);
int T = 1;
// cin >> T;
for(int turn = 1 ; turn <= T ; turn++)
solve();
}