/*
题意: 给出N个物品,每个物品有长L和宽W(不能掉换)
现最多允许挖K个洞,问最小需要挖的面积,每个洞不能重叠
先按照L从大到小排序,L相同的按照W从小到大排序
如果某个物品长和宽都小于等于另外一个物品,则这两个物品可以合并!
所以排序后,O(n)线扫处理得到实际需要处理的物品
可知此时 L[i]>=L[j],W[i]<=W[j] i<j
dp[k,i] = min{ dp[k-1,j] + L[j+1]*W[i] } k-1<=j<=i-1
需要单调队列O(NK)
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 50010;
const long long INF = 1LL<<60;
struct Wall
{
int L,W;
bool operator<(const Wall &B)const
{
if(L == B.L)return W < B.W;
return L > B.L;
}
};
int DQ[MAXN];
long long dp[2][MAXN];
Wall walls[MAXN];
int main()
{
//freopen("in","r",stdin);
int N,K;
while(~scanf("%d%d",&N,&K))
{
for(int i=1;i<=N;i++)
scanf("%d%d",&walls[i].L,&walls[i].W);
sort(walls+1,walls+1+N);
int tot = 1;
for(int i=2;i<=N;i++)
{
if(walls[i].W < walls[tot].W)continue;
walls[++tot] = walls[i];
}
N = tot;
if(K>N)K = N;
//dp[k,i] = min{ dp[k-1,j] + L[j+1]*W[i] } k-1<=j<=i-1
// Y[j] X[j]
int pre = 0,now = 1;
long long ans = INF;
dp[pre][0] = 0;
for(int i=1;i<=N;i++)dp[pre][i] = INF;
for(int k=1;k<=K;k++)
{
int front = 0,tail = 0;
for(int i=k;i<=N;i++)
{
//add i-1
while(front+1<tail && (dp[pre][DQ[tail-1]] - dp[pre][i-1])*(walls[DQ[tail-2]+1].L-walls[DQ[tail-1]+1].L) >= (dp[pre][DQ[tail-2]]-dp[pre][DQ[tail-1]])*(walls[DQ[tail-1]+1].L - walls[i].L))tail--;
DQ[tail++] = i-1;
while(front+1<tail && (dp[pre][DQ[front]]-dp[pre][DQ[front+1]])>=(long long)(-walls[i].W)*(walls[DQ[front]+1].L-walls[DQ[front+1]+1].L))front++;
int j = DQ[front];
dp[now][i] = dp[pre][j] + (long long)walls[j+1].L * walls[i].W;
}
ans = min(ans,dp[now][N]);
swap(now,pre);
}
printf("%I64d\n",ans);
}
return 0;
}