1 条题解

  • 1
    @ 2026-9-16 17:35:22
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAXN = 500005;
    const int INF = 0x3f3f3f3f;
    
    struct Node {
        int sum, lmax, rmax, dat;
        Node() : sum(0), lmax(-INF), rmax(-INF), dat(-INF) {}
        Node(int v) : sum(v), lmax(v), rmax(v), dat(v) {}
    } tr[MAXN << 2];
    
    Node merge(const Node &ls, const Node &rs) {
        Node res;
        res.sum = ls.sum + rs.sum;
        res.lmax = max(ls.lmax, ls.sum + rs.lmax);
        res.rmax = max(rs.rmax, rs.sum + ls.rmax);
        res.dat = max({ls.dat, rs.dat, ls.rmax + rs.lmax});
        return res;
    }
    
    int a[MAXN];
    
    void build(int u, int l, int r) {
        if (l == r) {
            tr[u] = Node(a[l]);
            return;
        }
        int mid = (l + r) / 2;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        tr[u] = merge(tr[u << 1], tr[u << 1 | 1]);
    }
    
    void update(int u, int l, int r, int pos, int val) {
        if (l == r) {
            tr[u] = Node(val);
            return;
        }
        int mid = (l + r) / 2;
        if (pos <= mid) update(u << 1, l, mid, pos, val);
        else update(u << 1 | 1, mid + 1, r, pos, val);
        tr[u] = merge(tr[u << 1], tr[u << 1 | 1]);
    }
    
    Node query(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) {
            return tr[u];
        }
        int mid = (l + r) / 2;
        if (qr <= mid) return query(u << 1, l, mid, ql, qr);
        if (ql > mid) return query(u << 1 | 1, mid + 1, r, ql, qr);
        Node left = query(u << 1, l, mid, ql, qr);
        Node right = query(u << 1 | 1, mid + 1, r, ql, qr);
        return merge(left, right);
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }
        build(1, 1, n);
        while (m--) {
            int k, x, y;
            cin >> k >> x >> y;
            if (k == 1) {
                if (x > y) swap(x, y);
                Node ans = query(1, 1, n, x, y);
                cout << ans.dat << '\n';
            } else {
                update(1, 1, n, x, y);
            }
        }
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    156
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    15
    已通过
    4
    上传者