/*
我们可以知道,如果xi<=xj&&yi<=yj,那么x就没有用了。所以我们按x排序,除去没用的点,这样转移方程就变成了f[i]=f[j-1]+x[j]*y[i]。
考虑两个转移f[j],f[k],且k<j<i ;
若对于f[i]从f[j]转移比从f[k]转移更优,那么f[j]+y[i]*x[j+1]<f[k]+y[i]*x[k+1];
移项得f(j)?f(k+1)/x(k)?x(j+1)<y(i)
然后用斜率优化。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 50010
#define lon long long
using namespace std;
lon f[N];int n,m,q[N];
struct node{
int x,y;
};node a[N],b[N];
bool cmp(const node&s1,const node&s2){
return s1.x>s2.x||(s1.x==s2.x&&s1.y>s2.y);
}
double xv(int j,int k){
return (f[j]-f[k])/(a[k+1].x-a[j+1].x);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&b[i].x,&b[i].y);
sort(b+1,b+n+1,cmp);
m=1;a[1]=b[1];
for(int i=2;i<=n;i++){
if(b[i].y>a[m].y)a[++m]=b[i];
}
int head=1,tail=1;q[1]=0;
for(int i=1;i<=m;i++){
if(head<tail&&xv(q[head],q[head+1])<a[i].y)head++;
f[i]=f[q[head]]+(lon)a[q[head]+1].x*(lon)a[i].y;
while(head<tail&&xv(q[tail-1],q[tail])>xv(q[tail],i))tail--;
q[++tail]=i;
}
cout<<f[m];
return 0;
}