#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <complex>
#include <locale>
#include <vector>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <bitset>
using namespace std;
struct line
{
long long a, b;
};
const int MAXN = 100000, MAXT = 100000, LOGT = 16;
int n, m, t[MAXN + 9], a[MAXN + 9], b[MAXN + 9], id[MAXN + 9];
long long sumA[MAXN + 9], sumB[MAXN + 9], sumBT[MAXN + 9], f[MAXN + 9];
line it[(1 << LOGT + 2) + 9];
int Cmp(int x, int y)
{
return t[x] < t[y];
}
long long Get(line d, int pos)
{
return d.a * pos + d.b;
}
long long Query(int x, int low, int high, int pos)
{
if(low > pos || high < pos)
{
return 0;
}
long long res = Get(it[x], pos);
if(low == high)
{
return res;
}
int mid = (low + high) / 2;
res = max(res, Query(x * 2, low, mid, pos));
res = max(res, Query(x * 2 + 1, mid + 1, high, pos));
return res;
}
void Update(int x, int low, int high, line val)
{
int mid = (low + high) / 2;
if(Get(val, low) <= Get(it[x], low) && Get(val, high) <= Get(it[x], high))
{
return;
}
if(Get(val, low) >= Get(it[x], low) && Get(val, high) >= Get(it[x], high))
{
it[x] = val;
return;
}
if(Get(val, low) <= Get(it[x], low) && Get(val, mid) <= Get(it[x], mid))
{
Update(x * 2 + 1, mid + 1, high, val);
return;
}
if(Get(val, low) >= Get(it[x], low) && Get(val, mid) >= Get(it[x], mid))
{
Update(x * 2 + 1, mid + 1, high, it[x]);
it[x] = val;
return;
}
if(Get(val, mid + 1) <= Get(it[x], mid + 1) && Get(val, high) <= Get(it[x], high))
{
Update(x * 2, low, mid, val);
return;
}
if(Get(val, mid + 1) >= Get(it[x], mid + 1) && Get(val, high) >= Get(it[x], high))
{
Update(x * 2, low, mid, it[x]);
it[x] = val;
return;
}
}
int main()
{
//ifstream cin("vmpizza.inp");
//ofstream cout("vmpizza.out");
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> t[i] >> a[i] >> b[i];
id[i] = i;
}
sort(id + 1, id + n + 1, Cmp);
for(int i = 1; i <= n; i++)
{
sumA[id[i]] = sumA[id[i - 1]] + a[id[i]];
sumB[id[i]] = sumB[id[i - 1]] + b[id[i]];
sumBT[id[i]] = sumBT[id[i - 1]] + (long long)b[id[i]] * t[id[i]];
}
for(int i = 1; i <= n; i++)
{
int x = id[i];
f[x] = Query(1, 1, MAXT, t[x]) - m + sumA[x] - (long long)sumB[x] * t[x] + sumBT[x];
Update(1, 1, MAXT, (line){sumB[x], f[x] - sumA[x] - sumBT[x]});
}
cout << f[id[n]] << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y29tcGxleD4KI2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxiaXRzZXQ+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCBsaW5lCnsKICAgIGxvbmcgbG9uZyBhLCBiOwp9Owpjb25zdCBpbnQgTUFYTiA9IDEwMDAwMCwgTUFYVCA9IDEwMDAwMCwgTE9HVCA9IDE2OwppbnQgbiwgbSwgdFtNQVhOICsgOV0sIGFbTUFYTiArIDldLCBiW01BWE4gKyA5XSwgaWRbTUFYTiArIDldOwpsb25nIGxvbmcgc3VtQVtNQVhOICsgOV0sIHN1bUJbTUFYTiArIDldLCBzdW1CVFtNQVhOICsgOV0sIGZbTUFYTiArIDldOwpsaW5lIGl0WygxIDw8IExPR1QgKyAyKSArIDldOwoKaW50IENtcChpbnQgeCwgaW50IHkpCnsKICAgIHJldHVybiB0W3hdIDwgdFt5XTsKfQoKbG9uZyBsb25nIEdldChsaW5lIGQsIGludCBwb3MpCnsKICAgIHJldHVybiBkLmEgKiBwb3MgKyBkLmI7Cn0KCmxvbmcgbG9uZyBRdWVyeShpbnQgeCwgaW50IGxvdywgaW50IGhpZ2gsIGludCBwb3MpCnsKICAgIGlmKGxvdyA+IHBvcyB8fCBoaWdoIDwgcG9zKQogICAgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgbG9uZyBsb25nIHJlcyA9IEdldChpdFt4XSwgcG9zKTsKICAgIGlmKGxvdyA9PSBoaWdoKQogICAgewogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKICAgIHJlcyA9IG1heChyZXMsIFF1ZXJ5KHggKiAyLCBsb3csIG1pZCwgcG9zKSk7CiAgICByZXMgPSBtYXgocmVzLCBRdWVyeSh4ICogMiArIDEsIG1pZCArIDEsIGhpZ2gsIHBvcykpOwogICAgcmV0dXJuIHJlczsKfQoKdm9pZCBVcGRhdGUoaW50IHgsIGludCBsb3csIGludCBoaWdoLCBsaW5lIHZhbCkKewogICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CiAgICBpZihHZXQodmFsLCBsb3cpIDw9IEdldChpdFt4XSwgbG93KSAmJiBHZXQodmFsLCBoaWdoKSA8PSBHZXQoaXRbeF0sIGhpZ2gpKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKEdldCh2YWwsIGxvdykgPj0gR2V0KGl0W3hdLCBsb3cpICYmIEdldCh2YWwsIGhpZ2gpID49IEdldChpdFt4XSwgaGlnaCkpCiAgICB7CiAgICAgICAgaXRbeF0gPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYoR2V0KHZhbCwgbG93KSA8PSBHZXQoaXRbeF0sIGxvdykgJiYgR2V0KHZhbCwgbWlkKSA8PSBHZXQoaXRbeF0sIG1pZCkpCiAgICB7CiAgICAgICAgVXBkYXRlKHggKiAyICsgMSwgbWlkICsgMSwgaGlnaCwgdmFsKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihHZXQodmFsLCBsb3cpID49IEdldChpdFt4XSwgbG93KSAmJiBHZXQodmFsLCBtaWQpID49IEdldChpdFt4XSwgbWlkKSkKICAgIHsKICAgICAgICBVcGRhdGUoeCAqIDIgKyAxLCBtaWQgKyAxLCBoaWdoLCBpdFt4XSk7CiAgICAgICAgaXRbeF0gPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYoR2V0KHZhbCwgbWlkICsgMSkgPD0gR2V0KGl0W3hdLCBtaWQgKyAxKSAmJiBHZXQodmFsLCBoaWdoKSA8PSBHZXQoaXRbeF0sIGhpZ2gpKQogICAgewogICAgICAgIFVwZGF0ZSh4ICogMiwgbG93LCBtaWQsIHZhbCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYoR2V0KHZhbCwgbWlkICsgMSkgPj0gR2V0KGl0W3hdLCBtaWQgKyAxKSAmJiBHZXQodmFsLCBoaWdoKSA+PSBHZXQoaXRbeF0sIGhpZ2gpKQogICAgewogICAgICAgIFVwZGF0ZSh4ICogMiwgbG93LCBtaWQsIGl0W3hdKTsKICAgICAgICBpdFt4XSA9IHZhbDsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgLy9pZnN0cmVhbSBjaW4oInZtcGl6emEuaW5wIik7CiAgICAvL29mc3RyZWFtIGNvdXQoInZtcGl6emEub3V0Iik7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZShOVUxMKTsKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBjaW4gPj4gdFtpXSA+PiBhW2ldID4+IGJbaV07CiAgICAgICAgaWRbaV0gPSBpOwogICAgfQogICAgc29ydChpZCArIDEsIGlkICsgbiArIDEsIENtcCk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBzdW1BW2lkW2ldXSA9IHN1bUFbaWRbaSAtIDFdXSArIGFbaWRbaV1dOwogICAgICAgIHN1bUJbaWRbaV1dID0gc3VtQltpZFtpIC0gMV1dICsgYltpZFtpXV07CiAgICAgICAgc3VtQlRbaWRbaV1dID0gc3VtQlRbaWRbaSAtIDFdXSArIChsb25nIGxvbmcpYltpZFtpXV0gKiB0W2lkW2ldXTsKICAgIH0KICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgewogICAgICAgIGludCB4ID0gaWRbaV07CiAgICAgICAgZlt4XSA9IFF1ZXJ5KDEsIDEsIE1BWFQsIHRbeF0pIC0gbSArIHN1bUFbeF0gLSAobG9uZyBsb25nKXN1bUJbeF0gKiB0W3hdICsgc3VtQlRbeF07CiAgICAgICAgVXBkYXRlKDEsIDEsIE1BWFQsIChsaW5lKXtzdW1CW3hdLCBmW3hdIC0gc3VtQVt4XSAtIHN1bUJUW3hdfSk7CiAgICB9CiAgICBjb3V0IDw8IGZbaWRbbl1dIDw8ICJcbiI7CiAgICByZXR1cm4gMDsKfQoK