Problem:
Problem E: Rabbit Plays Games!

うさぎがとあるロールプレイングゲームで遊んでいる. 城に入る直前で, 敵に待ち伏せされていた！

うさぎが操作する主人公1 人と, n 体の敵との戦闘となった. 各キャラクターには4 つの能力値, 体力hi, 攻撃力ai, 防御力di, 敏捷si が定められている. i = 0 は主人公の情報, 1 ≤ i ≤ n は各敵の情報を表す.

戦闘はターン制である. 各ターン, 生き残っているキャラクターが, 敏捷の値が高い順に攻撃を行う. 敵は必ず主人公を攻撃する. 主人公は敵1 体を攻撃するが, どの敵を攻撃するかは毎ターンごとに主人公が選べる.攻撃力a のキャラクターが防御力d のキャラクターに攻撃するとき, max{a − d, 0} のダメージが与えられる. 受けたダメージの合計が体力の値以上になったキャラクターは直ちに戦闘不能になってしまう. 主人公が戦闘不能になったとき, あるいは敵がすべて戦闘不能になったとき, 戦闘は終了する.

Input

1 ≤ n ≤ 40 000

1 ≤ hi, ai, di, si ≤ 1 000 000 000 (整数)

si はすべて異なる.

Output

主人公が必ず戦闘不能になってしまうとき, −1 を出力せよ. そうでないとき, 主人公が受けるダメージの合計の最小値を一行に出力せよ.

Sample Input 1

2
10 3 1 2
2 4 1 3
2 2 1 1

Sample Output 1

4

Sample Input 2

1
1 1 1 1
10000 10000 10000 10000

Sample Output 2

-1

Solution in C++14 (judge verdict: Accepted)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

#ifdef BTK
#include<dvector.h>
#define DEBUG if(1)
#else
#define CIN_ONLY if(1)
struct cww{cww(){
    CIN_ONLY{
        ios::sync_with_stdio(false);cin.tie(0);
    }
}}star;
#define DEBUG if(0)
#endif

#define fin "\n"
#define FOR(i,bg,ed) for(int i=(bg);i<(ed);i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second
#define pb push_back
#define REC(ret, ...) std::function<ret (__VA_ARGS__)>
template <typename T>inline bool chmin(T &l,T r)
{bool a=l>r;if(a)l=r;return a;}
template <typename T>inline bool chmax(T &l,T r)
{bool a=l<r;if(a)l=r;return a;}
template <typename T>
istream& operator>>(istream &is,vector<T> &v){
    for(auto &it:v)is>>it;
    return is;
}

LL dm[41234];
LL nt[41234];
LL ceil(LL a,LL b){
    return (a+b-1)/b;
}
typedef vector<int> V;
int main(){
    int n;
    LL hh,aa,dd,ss;
    cin>>n>>hh>>aa>>dd>>ss;
    LL ret=0;
    REP(i,n){
        int h,a,d,s;
        cin>>h>>a>>d>>s;
        if(aa-d<=0&&a-dd>0){
            cout<<-1<<endl;
            return 0;
        }
        if(a-dd<=0){
            i--;
            n--;
            continue;
        }
        dm[i]=a-dd;
        nt[i]=ceil(h,aa-d);
        if(ss<s)ret+=dm[i];
    }
    V v(n);
    iota(ALL(v),0);
    sort(ALL(v),
         [&](const int i,const int j){
             LL dij=dm[i]*(nt[i]-1)+dm[j]*(nt[i]+nt[j]-1);
             LL dji=dm[j]*(nt[j]-1)+dm[i]*(nt[i]+nt[j]-1);
             return dij<dji;
         }
         );
    LL turn=0;
    for(auto &i:v){
        DEBUG cout<<i<<" "<<dm[i]<<" "<<nt[i]<<endl;
        turn+=nt[i];
        ret+=dm[i]*(turn-1);
        if(ret>=hh){
            cout<<-1<<endl;
            return 0;
        }
    }
    cout<<ret<<endl;
    
    return 0;
}