#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<int> compress;
int f(int u){
return lower_bound(compress.begin(), compress.end(), u) - compress.begin() + 1;
}
const int maxn = 1e6 + 5;
int bit[maxn];
void incr(int p, int x){
for(; p < maxn; p +=p & -p) bit[p] += x;
}
int get(int p){
int sum = 0;
for(; p; p -= p & -p) sum += bit[p];
return sum;
}
int st[4 * maxn];
int mxqry(int id, int l, int r, int u, int v){
if(l > v || r < u) return 0;
if(u <= l && r <= v) return st[id];
int mid = (l + r) / 2;
return max(mxqry(id * 2, l, mid, u, v), mxqry(id * 2 + 1, mid + 1, r, u, v));
}
void update(int id, int l, int r, int pos, int val){
if(l == r) st[id] = max(st[id], val);
else{
int mid = (l + r) / 2;
if(pos <= mid) update(id * 2, l, mid, pos, val);
else update(id * 2 + 1, mid + 1, r, pos, val);
st[id] = max(st[id * 2], st[id * 2 + 1]);
}
}
vector<pair<int, int>> qry[maxn];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, k; cin >> n >> k;
vector<int> a(n + 1), b(n + 1), T(k + 1), state(n + 1);
for(int i = 1; i <= n; i++){
cin >> a[i] >> b[i];
compress.push_back(a[i]);
compress.push_back(b[i] - 1);
if(a[i] > b[i]){
state[i] = 1;
swap(a[i], b[i]);
}
}
for(int i = 1; i <= k; i++){
cin >> T[i];
compress.push_back(T[i]);
}
sort(compress.begin(), compress.end());
compress.erase(unique(compress.begin(), compress.end()), compress.end());
for(int i = 1; i <= k; i++){
T[i] = f(T[i]);
update(1, 1, maxn - 1, T[i], i);
}
vector<int> res(n + 1);
for(int i = 1; i <= n; i++){
int tmp = f(b[i] - 1);
res[i] = mxqry(1, 1, maxn - 1, f(a[i]), tmp);
if(res[i]) state[i] = 1; //thg lớn hơn đang ở trên
qry[res[i]].push_back({i, tmp});
}
vector<int> ans(n + 1);
for(int i = k; i >= 0; i--){
if(i) incr(T[i], 1);
for(auto [id, r]: qry[i]) ans[id] = k - i + (i != 0) - get(r);
}
int sum = 0;
for(int i = 1; i <= n; i++){
if((state[i] + ans[i]) % 2 == 0) sum += a[i];
else sum += b[i];
}
cout << sum;
}