/*
一道題作了一個上午,無語了。。。
我本身作的是設dp[i]表明從後往前創建倉庫,建到第i個時的最小花費,而後枚舉它要搬到的地方
轉移方程爲dp[i]=min(dp[j-1]+x[j]*(sp[j-1]-sp[i-1])-spx[j-1]+spx[i-1]+c[j])
而後開始斜率優化,WA了一個上午,小數據對拍怎麼都過,大數據偶爾出錯可是調不了啊!
無奈看別人的代碼,發現比我寫得簡潔得多,從前向後轉移的,是把i做爲這一段貨物的儲存點,而後枚舉開端,感受和個人差很少,就是不知道爲何錯了。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define N 1000010
#define lon long long
using namespace std;
lon p[N],x[N],sp[N],spx[N],c[N],dp[N],q[N],n;
lon read(){
lon num=0,flag=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();}
return num*flag;
}
double lv(int j,int k){
return (double)(dp[k]+spx[k]-dp[j]-spx[j])/(sp[k]-sp[j]);
}
int main(){
n=read();
for(int i=1;i<=n;i++){
x[i]=read();p[i]=read();c[i]=read();
sp[i]=sp[i-1]+p[i];spx[i]=spx[i-1]+p[i]*x[i];
}
int h=0,t=0;
for(int i=1;i<=n;i++){
while(h<t&&lv(q[h],q[h+1])<x[i]) h++;
dp[i]=dp[q[h]]+(sp[i]-sp[q[h]])*x[i]-spx[i]+spx[q[h]]+c[i];
while(h<t&&lv(q[t],i)<lv(q[t-1],q[t])) t--;
q[++t]=i;
}
cout<<dp[n];
return 0;
}