#include #include #define chmin(x,y) (x) = min((x),(y)) #define chmax(x,y) (x) = max((x),(y)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define vec vector #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define pb push_back #define eb emplace_back using namespace std; using namespace atcoder; using ll = long long; using ld = long double; const ll mod = 998244353; using mint = modint998244353; const vector dx = {1,0,-1,0}, dy = {0,1,0,-1}; // using Graph = vector>>; using Graph = vector>; ll ceill(ll x, ll y){ ll res = x / y; if(x % y > 0) res++; return res; } int main(){ // input int N; ll Y,Z; cin >> N >> Y >> Z; vector> P(N); rep(i,N){ ll c,l,x; cin >> c >> l >> x; P[i] = {l,x,c}; } sort(all(P)); // solve int pos = 0; ll ans = 0, now = Y, nxt = min(P[pos][0],Z); priority_queue> pq; while(now < Z){ if(pq.size()){ auto[lev,num] = pq.top(); pq.pop(); ll tmp = ceill(nxt-now,lev); if(tmp < num){ ans += tmp; now += tmp * lev; pq.emplace(lev,num-tmp); } else{ ans += num; now += lev * num; } } while(pos < N && P[pos][0] <= now){ pq.emplace(P[pos][1],P[pos][2]); pos++; } if(pq.empty()) break; nxt = (pos == N ? Z : min(P[pos][0],Z)); } // output cout << (now >= Z ? ans : -1) << endl; }