Untitled

 avatar
unknown
c_cpp
2 months ago
2.0 kB
1
Indexable
/**
 *    author:  MaGnsi0
 *    created: 13.09.2023 19:07:33
**/
#include <bits/stdc++.h>

using namespace std;

template <typename T>
struct segment_tree {
    int N;
    T E;
    vector<T> S;
    function<T(T, T)> F;
    segment_tree(int n, T e, function<T(T, T)> f) : N(n), E(e), S(2 * n, e), F(f) {}
    void update(int j, T x) {
        for (S[j += N] = x; j /= 2;) {
            S[j] = F(S[2 * j], S[2 * j + 1]);
        }
    }
    T query(int L, int R) {
        if (L == R) { return E; }
        T l = E, r = E;
        for (L += N, R += N; L < R; L /= 2, R /= 2) {
            if (L % 2) {
                l = F(l, S[L++]);
            }
            if (R % 2) {
                r = F(S[--R], r);
            }
        }
        return F(l, r);
    }
};

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n, S;
    cin >> n >> S;
    vector<tuple<int, int, int>> a(n);
    for (int i = 0; i < n; ++i) {
        int l, r, c;
        cin >> l >> r >> c;
        a[i] = {l, r, c};
    }
    sort(a.begin(), a.end());
    set<int> s;
    for (int i = 0; i < n; ++i) {
        s.insert(get<0>(a[i]));
        s.insert(get<1>(a[i]));
    }
    map<int, int> mp;
    for (int x : s) {
        mp[x] = (int)mp.size();
    }
    int m = (int)mp.size();
    segment_tree<int64_t> b(m, 0, [](int64_t x, int64_t y) { return max(x, y); });
    segment_tree<int64_t> c(m, 0, [](int64_t x, int64_t y) { return max(x, y); });
    vector<int64_t> dp(n);
    for (int i = n - 1; i >= 0; --i) {
        int64_t L = get<0>(a[i]);
        int64_t R = get<1>(a[i]);
        int64_t C = get<2>(a[i]);
        int j = mp[L], k = mp[R];
        int64_t x = b.query(j, k + 1) - L * S - C;
        int64_t y = c.query(k + 1, m) + (R - L + 1) * S - C;
        dp[i] = max(x, y);
        b.update(j, max(dp[i] + L * S, b.query(j, j + 1)));
        c.update(j, max(dp[i], c.query(j, j + 1)));
    }
    int64_t ans = 0;
    for (int i = 0; i < n; ++i) {
        ans = max(ans, dp[i]);
    }
    cout << ans;
}
Leave a Comment