#include #include #include #include #include #include #define rep(i, n) for(i = 0; i < n; i++) #define int long long using namespace std; typedef pair P; typedef tuple T; int n, Y, Z; int C[200001], L[200001], X[200001]; signed main() { int i; cin >> n >> Y >> Z; vector vecT; rep(i, n) { cin >> C[i] >> L[i] >> X[i]; vecT.push_back(T(L[i], C[i], X[i])); } sort(vecT.begin(), vecT.end()); rep(i, n) { L[i] = get<0>(vecT[i]); C[i] = get<1>(vecT[i]); X[i] = get<2>(vecT[i]); } L[n] = (1LL << 60); int cor = 0; priority_queue

que; //(level_up, count) while (cor < n && L[cor] <= Y) { que.push(P(X[cor], C[cor])); cor++; } int level = Y, ans = 0; while (!que.empty()) { P now = que.top(); que.pop(); int cnt1 = (Z - level + now.first - 1) / now.first; int cnt2 = (L[cor] - level + now.first - 1) / now.first; /*cout << "level: " << level << ", ans: " << ans << ", cnt1: " << cnt1 << ", cnt2: " << cnt2 << endl; priority_queue

que2 = que; cout << "now = " << now.first << ", " << now.second << endl; cout << "que2:" << endl; while (!que2.empty()) { P now2 = que2.top(); que2.pop(); cout << " " << now2.first << ", " << now2.second << endl; } cout << endl;*/ if (cnt1 <= cnt2) { //新しいスライムが追加される前に終了する if (cnt1 <= now.second) { //今のスライムで終わる ans += cnt1; level += now.first * cnt1; break; } else { //今のスライムが全て倒される ans += now.second; level += now.first * now.second; } } else { if (cnt2 <= now.second) { ans += cnt2; level += now.first * cnt2; //スライムの追加 if (now.second - cnt2 >= 1) { que.push(P(now.first, now.second - cnt2)); } que.push(P(X[cor], C[cor])); cor++; } else { ans += now.second; level += now.first * now.second; } } } //cout << "level: " << level << ", ans: " << ans << endl; if (level < Z) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }