#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=1e5+5;

// 定义奶牛结构体:存储每头奶牛的往返时间T(单程T分钟,往返2*T)、每分钟毁花数D
struct caw{
    ll T;  // 运输该奶牛单程所需时间(分钟)
    ll D;  // 该奶牛每分钟毁掉的花朵数量
};

caw a[N];  // 存储所有奶牛的信息

int main() {
    // 关闭cin/cout同步,加速输入输出(处理大数据量时必要)
    ios::sync_with_stdio(0),cin.tie(0);
    
    ll n;
    cin>>n;  // 读取奶牛总数
    
    // 步骤1:输入每头奶牛的T和D
    for(ll i=1;i<=n;i++){
        cin>>a[i].T>>a[i].D;
    }
    
    // 步骤2:贪心排序(核心)
    // 排序规则:a.T*b.D < b.T*a.D → a排在b前面
    // 规则推导:优先运输"时间×对方毁花数"更小的奶牛,总毁花量最小
    // 本质是比较两头牛i/j:若T_i*D_j < T_j*D_i,则先运i更优
    sort(a+1,a+n+1,[](caw a,caw b){
        return a.T*b.D<b.T*a.D;
    });
    
    // 步骤3:初始化累计时间和总毁花数
    ll t=2*a[1].T;  // 第一头奶牛的往返时间(它被运走后,后续奶牛开始累计等待时间)
    ll ans=0;       // 存储所有奶牛毁掉的花朵总数
    
    // 步骤4:遍历计算每头奶牛的毁花量并累加
    // 第i头奶牛的毁花量 = 它的D × 前面所有奶牛的往返时间总和(它的等待时间)
    for(ll i=2;i<=n;i++){
        ans+=a[i].D*t;  // 累加当前奶牛的毁花量
        t+=2*a[i].T;    // 更新累计往返时间(加上当前奶牛的往返时间)
    }
    
    // 步骤5:输出总毁花数
    cout<<ans;
    return 0;
}