/VOI 22 Bài 4 - Đoạn số

<Problem>

https://oj.vnoi.info/problem/voi22_sseq
              #include <iostream>
        #include <cmath>
        #include <vector>
        using namespace std;
        
        const  int N = 1e5, LIM = 1e6;
        
        int n, l[N], r[N], w[N];
        vector<int> arr[2 * LIM + 1];
        long long st[LIM * 4], lz[LIM * 4];
        
        void update(int id, int l, int r, int u, int v, int x) {
            if (v < l || r < u) return;
            if (u <= l && r <= v) {
                st[id] += x;
                lz[id] += x;
                return;
            }
            int mid = (l + r) / 2;
            update(id * 2, l, mid, u, v, x);
            update(id * 2 + 1, mid + 1, r, u, v, x);
            st[id] = max(st[id * 2], st[id * 2 + 1]) + lz[id];
        }
        
        int main() {
            if (fopen("SSEQ.INP", "r")) {
                freopen("SSEQ.INP", "r", stdin);
                freopen("SSEQ.OUT", "w", stdout);
            }
            cin >> n;
        
            for (int i = 0; i < n; i++) {
                cin >> l[i] >> r[i] >> w[i];
                arr[l[i]].push_back(i);
                update(1, 1, LIM, r[i], LIM, w[i]);
            }
        
            long long ans = -9223372036854775807;
        
            for (int a = 1; a <= LIM; a++) {
                for (int i = 0; i < arr[a].size(); i++) {
                    update(1, 1, LIM, r[arr[a].at(i)], LIM, -w[arr[a].at(i)]);
                }
                ans = max(ans, st[1]);
            }
        
            cout << ans << endl;
        
            return 0;
        }