P2880 [USACO07JAN] Balanced Lineup Ghttps://www.luogu.com.cn/problem/P2880
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
#include <cstdlib>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
int n, m;
int a[MAXN];
int tree1[MAXN];
int tree2[MAXN];
inline void update(int pos, int x) {
for (; pos <= n; pos += lowbit(pos)) {
tree1[pos] = max(tree1[pos], x);
tree2[pos] = min(tree2[pos], x);
}
}
int findmax(int l, int r) {
if (r > l) {
if (r - lowbit(r) > l) {
return max(tree1[r], findmax(l, r - lowbit(r)));
} else {
return max(a[r], findmax(l, r - 1));
}
}
return a[l];
}
int findmin(int l, int r) {
if (r > l) {
if (r - lowbit(r) > l) {
return min(tree2[r], findmin(l, r - lowbit(r)));
} else {
return min(a[r], findmin(l, r - 1));
}
}
return a[l];
}
int main() {
memset(tree2, INF, sizeof(tree2));
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", a + i);
update(i, a[i]);
}
while (m--) {
int l, r;
scanf("%d %d", &l, &r);
printf("%d\n", findmax(l, r) - findmin(l, r));
}
return 0;
}
#if 0
int n;
int st1[MAXN][21];
int st2[MAXN][21];
inline int query(int l, int r) {
int x = (int)log2(r - l + 1);
return max(st1[l][x], st1[r - (1 << x) + 1][x]) - min(st2[l][x], st2[r - (1 << x) + 1][x]);
}
int main() {
int t;
scanf("%d %d", &n, &t);
for (int i = 1; i <= n; i++) {
scanf("%d", &st1[i][0]);
st2[i][0] = st1[i][0];
}
for (int j = 1; j <= 21; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
st1[i][j] = max(st1[i][j - 1], st1[i + (1 << (j - 1))][j - 1]);
st2[i][j] = min(st2[i][j - 1], st2[i + (1 << (j - 1))][j - 1]);
}
}
while (t--) {
int l, r;
scanf("%d %d", &l, &r);
printf("%d\n", query(l, r));
}
return 0;
}
#endif