Submission

Status:

(PPPP)(PPP)(PPPP)(PPPPPPP)(PPPPPPP)(PPPPPPPPPPP)(PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP)

Subtask/Task Score:

{9/9}{5/5}{6/6}{11/11}{14/14}{25/25}{30/30}

Score: 100

User: PakinDioxide

Problemset: ผลึกเวลา (Crystal)

Language: cpp

Time: 0.268 second

Submitted On: 2025-09-24 16:58:18

#include <bits/stdc++.h>

using namespace std;

const int mxU = 1005, mxN = 1e5+5;

int u, k, n;

int fen[mxU][mxN];

void upd(int idx, int x, int U) {
    for (int i = idx; i <= n+5; i += i & -i) fen[U][i] = max(fen[U][i], x);//, cerr << i << '\n';
}

int qr(int idx, int U) {
    int x = 0;
    for (int i = idx; i > 0; i -= i & -i) x = max(x, fen[U][i]);
    return x;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> u >> k >> n;
    vector <int> cmp;
    vector <tuple <int, int, int>> a(n);
    for (auto &[z, x, y] : a) cin >> x >> y >> z, cmp.emplace_back(x), y++;
    sort(a.begin(), a.end());
    sort(cmp.begin(), cmp.end());
    // cout << '\n';
    int ans = 0;
    // cout << '\n';
    for (auto &[z, x, y] : a) {
        x = upper_bound(cmp.begin(), cmp.end(), x) - cmp.begin();
        // cerr << x << ' ' << y << ' ' << z << '\n';
        int mx = 0;
        mx = max(mx, qr(x-1, y) + 1);
        mx = max(mx, qr(x-1, u+1) + 1 - k);
        upd(x, mx, y);
        upd(x, mx, u+1);
        ans = max(ans, mx);
    }
    cout << ans << '\n';
    // SUB O(UN)

    // SUB U = 1, k = 0;
    // vector <pair <int, int>> V;
    // for (int i = 0; i < n; i++) {
    //     int x, y, z; cin >> x >> y >> z;
    //     V.emplace_back(z, x);
    // }
    // sort(V.begin(), V.end());
    // vector <int> d;
    // for (auto &[x, e] : V) {
    //     int it = lower_bound(d.begin(), d.end(), e) - d.begin();
    //     if (it == d.size()) d.emplace_back(e);
    //     else d[it] = e;
    // }
    // cout << d.size() << '\n';
}