#include <bits/stdc++.h>
using namespace std;
// Muito cuidado por aqui ↓
#define int long long
#define pb push_back
#define f first
#define s second
#define all(v) v.begin(), v.end()
#define dbg(v) cerr << #v << " = " << v << "\n"
#define fall(i, s, n) for(int i=s; i<n; i++)
#define rfall(i, s, n) for(int i=s; i>=n; i--)
typedef pair<int, int> pii;
typedef tuple<int, int, int> trio;
typedef tuple<int, int, int, int> squad;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int MAXN = 2e5+7;
int bit[MAXN];
void upd(int x, int v){
while(x < MAXN) bit[x] += v, x += x&-x;
}
int qry(int x){
int sum=0;
while(x) sum += bit[x], x -= x&-x;
return sum;
}
int32_t main(){
ios::sync_with_stdio(0); cin.tie(0);
int n, k; cin >> n >> k;
int a[n+1], b[n+1];
vector<pii> v;
fall(i, 1, n+1){
cin >> a[i] >> b[i];
v.pb({max(a[i], b[i]), i});
}
int q[k+1];
fall(i, 1, k+1){
int a, b; cin >> a, b=i;
v.pb({a, n+b});
q[i]=a;
}
sort(all(v));
set<pii> st;
int lst[n+1];
for(auto [x, j] : v){
if(j >= n+1){// min/max queue
st.insert({x, j-n});
while(st.find({x, j-n}) != st.begin()){
auto it = st.find({x, j-n}); it--;
if((*it).f <= x && (*it).s < j-n) st.erase(it);
else break;
}
}else{
auto it = st.lower_bound({min(a[j], b[j]), -1});
if(it == st.end()) lst[j]=0;
else lst[j]=(*it).s;
}
}
fall(i, 1, n+1) if(lst[i] && a[i] < b[i]) swap(a[i], b[i]);
fall(i, 1, k+1) upd(i, 1);
int sum=0;
for(auto [x, j] : v){
if(j >= n+1) upd(j-n, -1);
else{
int t = qry(MAXN-1)-qry(lst[j]);
if(t%2) sum += b[j];
else sum += a[j];
}
}
cout << sum << "\n";
}