牛客周赛 Round 51 F-小红的数组 题型:线段树

42 阅读1分钟

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;
}

image.png