#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
#define maxn 50010
ll dp[maxn][110], q[maxn];
struct node {
ll w, h;
} peo[maxn];
bool cmp(node a, node b) {
if (a.h == b.h) {
return a.w > b.w;
} else {
return a.h > b.h;
}
}
ll gety(int i, int j, int k) {
return dp[j][k] - dp[i][k];
}
ll getx(int x1, int x2) {
return peo[x1 + 1].h - peo[x2 + 1].h;
}
int main() {
int n, k;
while (scanf("%d%d", &n, &k) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%lld%lld", &peo[i].w, &peo[i].h);
}
sort(peo + 1, peo + n + 1, cmp);
int num = 1;
for (int i = 1; i <= n; i++) {
if (peo[i].w > peo[num].w) {
peo[++num] = peo[i];
}
}
n = num;
k = min(k, n);
for (int i = 1; i <= n; i++) {
dp[i][1] = peo[1].h * peo[i].w;
}
for (int j = 2; j <= k; j++) {
int head = 0, tail = 0;
q[tail++] = 0;
for (int i = 1; i <= n; i++) {
while (head + 1 < tail && gety(q[head], q[head + 1], j - 1) <= peo[i].w * getx(q[head], q[head + 1])) {
head++;
}
dp[i][j] = dp[q[head]][j - 1] + peo[q[head] + 1].h * peo[i].w;
while (head + 1 < tail && gety(q[tail - 1], i, j - 1) * getx(q[tail - 2], q[tail - 1]) <=
gety(q[tail - 2], q[tail - 1], j - 1) * getx(q[tail - 1], i)) {
tail--;
}
q[tail++] = i;
}
}
ll ans = dp[n][1];
for (int i = 2; i <= k; i++) {
ans = min(ans, dp[n][i]);
}
printf("%lld\n", ans);
}
return 0;
}