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

using ll = long long;

template<typename X, typename Y>
bool chmax(X& a, Y b) { return (a < b) ? a = b, 1 : 0; }
template<typename X, typename Y>
bool chmin(X& a, Y b) { return (a > b) ? a = b, 1 : 0; }

void print(__int128 x) {
    if (x == 0) {
        cout << "0\n";
        return;
    }
    if (x < 0) { cout << "-"; x = -x; }
    string s;
    while (x) {
        s.push_back((char)(x % 10) + '0');
        x /= 10;
    }
    reverse(s.begin(), s.end());
    cout << s << '\n';
}

const int N = 1e5+5;

struct Del {
    ll s, f, w;
};

struct Event {
    ll t, w, op;
    bool operator<(const Event& o) const {
        return t < o.t;
    }
};

int n, m;
vector<ll> vals;

struct Node {
    int cnt;
    __int128 sum;
} st[4*N];

void update(int id, int l, int r, int k, ll s, ll x) {
    if (l == r) {
        st[id].cnt += s;
        st[id].sum += (__int128)s * x;
        return;
    }
    int mid = (l + r) >> 1;
    if (k <= mid) update(id << 1, l, mid, k, s, x);
    else update(id << 1 | 1, mid + 1, r, k, s, x);
    st[id].cnt = st[id << 1].cnt + st[id << 1 | 1].cnt; 
    st[id].sum = st[id << 1].sum + st[id << 1 | 1].sum; 
}

__int128 walk(int id, int l, int r, ll x) {
    if (x <= 0 || st[id].cnt == 0) return 0;
    if (st[id].cnt <= x) return st[id].sum;
    if (l == r) return (__int128)x * vals[l - 1];
    int mid = (l + r) >> 1;
    if (st[id << 1 | 1].cnt >= x) return walk(id << 1 | 1, mid + 1, r, x);
    return st[id << 1 | 1].sum + walk(id << 1, l, mid, x - st[id << 1 | 1].cnt);
}

void solve() {
    cin >> n >> m;
    vector<Del> dels;
    __int128 base = 0;
    for (int i = 0; i < n; i++) {
        int a, b, s, f; cin >> a >> b >> s >> f;
        base += (__int128)(f - s) * b;
        if (a > b) {
            dels.push_back({s, f, a - b});
            vals.push_back(a - b);
        }
    }
    if (dels.empty()) {
        print(base);
        return;
    }
    sort(vals.begin(), vals.end());
    vals.erase(unique(vals.begin(), vals.end()), vals.end());
    int sz = vals.size();
    vector<Event> events;
    for (auto& [s, f, w] : dels) {
        events.push_back({s, w, 1});
        events.push_back({f, w, -1});
    }
    sort(events.begin(), events.end());
    __int128 ans = base;
    ll last_t = events[0].t;
    for (int i = 0; i < (int)events.size(); ) {
        int j = i;
        if (events[i].t > last_t) {
            ans += walk(1, 1, sz, m) * (events[i].t - last_t);
            last_t = events[i].t;
        }
        while (j < (int)events.size() && events[j].t == events[i].t) {
            int idx = lower_bound(vals.begin(), vals.end(), events[j].w) - vals.begin() + 1;
            update(1, 1, sz, idx, events[j].op, events[j].w);
            j++;
        }
        i = j;
    }
    print(ans);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    #define TASK "ORCONF"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }

    int tests = 1; // cin >> tests;
    while (tests--) solve();

    #ifndef LOCAL
    cerr << "\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
    #endif
    return 0;
}
