F-小红的数组_牛客周赛 Round 51 (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
#define int long long
const int inf = 1e18;
int a[N];
struct SegTree {
// int sum;
int maxn;
int minn;
} seg[N << 2];
void pushup(int rt) {
// seg[rt].sum = seg[rt << 1].sum + seg[rt << 1 | 1].sum;
seg[rt].maxn = max(seg[rt << 1].maxn, seg[rt << 1 | 1].maxn);
seg[rt].minn = min(seg[rt << 1].minn, seg[rt << 1 | 1].minn);
}
void build (int l, int r, int rt) {
if (l == r) {
// seg[rt].sum = a[l];
seg[rt].maxn = seg[rt].minn = a[l];
return ;
}
int mid = (l + r) >> 1;
build (l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
pushup(rt);
}
pair<int, int> query(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) {
return {seg[rt].maxn, seg[rt].minn};
}
int mid = (l + r) >> 1;
int mx = -inf, mi = inf;
if (L <= mid) {
auto [x, y] = query(L, R, l, mid, rt << 1);
mx = max(x, mx);
mi = min(y, mi);
}
if (R > mid) {
auto [x, y] = query(L, R, mid + 1, r, rt << 1 | 1);
mx = max(x, mx);
mi = min(y, mi);
}
return {mx, mi};
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i], a[i] += a[i - 1];
build(0, n, 1);
int q; cin >> q;
while (q--) {
int l, r; cin >> l >> r;
auto [mx, mi] = query(l - 1, r, 0, n, 1);
cout << abs(mx - mi) << '\n';
}
return 0;
}