Link
#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define db double
#define pii pair<int,int>
#define pb push_back
#define mk make_pair
#define fir first
#define sec second
using namespace std;
inline int read() {
int s = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
s = s * 10 + c - 48;
c = getchar();
}
return s * f;
}
int n, m;
int a[50005];
int cnt = 0;
struct node {
int k, p;
}magic[50005];
int mx[50005];
int x[50004];
int sum[50004];
int f[50005][502];
signed main() {
n = read(), m = read();
for (int i = 1; i <= n; i ++)
magic[i] = (node) {
read(), read()
},
a[++ cnt] = magic[i].k,
mx[i] = max(mx[i - 1], magic[i].p);
sort(a + 1, a + 1 + cnt);
cnt = unique(a + 1, a + 1 + cnt) - a;
for (int i = 1; i <= n; i ++) magic[i].k = lower_bound(a + 1, a + 1 + cnt, magic[i].k) - a;
for (int i = 1; i <= n; i ++)
x[i] = lower_bound(a + 1, a + 1 + cnt, read()) - a,
sum[magic[i].k] += magic[i].p,
mx[i] = max(mx[i], sum[x[i]]);
f[1][0] = mx[1];
for (int i = 2; i <= n; i ++) {
f[i][0] = f[i - 1][0] + mx[i];
for (int j = 1; j <= m; j ++)
f[i][j] = max(f[i - 1][j] + mx[i], f[i - 2][j - 1] + mx[i] * 2);
}
int ans = -1;
for (int i = 0; i <= m; i ++) ans = max(ans, f[n][i]);
cout << ans << '\n';
return 0;
}