#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
constexpr ll MAXN=6e5+5,MOD=998244353,INF=1e18;
ll n,m,i,j,p,k,t,ans,st,en,b[MAXN],luu[MAXN],ma[MAXN],out[MAXN],state[MAXN],sz;
struct h{
ll a,b,id,ida,idb;
} a[MAXN];
bool cmp(h x,h y){
return ma[x.id]>ma[y.id];
}
bool cmp1(h x,h y){
return x.id<y.id;
}
struct seg{
ll b[4*MAXN],cnt[4*MAXN];
void update(ll in,ll l,ll r,ll pos,ll val){
if(l>pos||r<pos) return;
else if(l==r&&r==pos){
b[in]=max(b[in],val);
}
else{
ll m=(l+r)>>1;
update(in*2,l,m,pos,val);
update(in*2+1,m+1,r,pos,val);
b[in]=max(b[in*2],b[in*2+1]);
}
}
ll get(ll in,ll l,ll r,ll l1,ll r1){
if(l>r1||r<l1) return 0;
else if(l>=l1&&r<=r1){
return b[in];
}
else{
ll m=(l+r)>>1;
return max(get(in*2,l,m,l1,r1),get(in*2+1,m+1,r,l1,r1));
}
}
void update1(ll in,ll l,ll r,ll pos){
if(l>pos||r<pos) return;
else if(l==r&&r==pos){
cnt[in]++;
}
else{
ll m=(l+r)>>1;
update1(in*2,l,m,pos);
update1(in*2+1,m+1,r,pos);
cnt[in]=cnt[in*2]+cnt[in*2+1];
}
}
ll get1(ll in,ll l,ll r,ll l1,ll r1){
if(l>r1||r<l1) return 0;
else if(l>=l1&&r<=r1){
return cnt[in];
}
else{
ll m=(l+r)>>1;
return get1(in*2,l,m,l1,r1)+get1(in*2+1,m+1,r,l1,r1);
}
}
} seg;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("ILIGHT.INP","r",stdin);
// freopen("ILIGHT.OUT","w",stdout);
cin>>n>>m;
vector<ll> nen;
for(i=1;i<=n;i++){
cin>>a[i].a>>a[i].b;
a[i].id=i;
nen.pb(a[i].a);
nen.pb(a[i].b);
if(a[i].a>a[i].b){
swap(a[i].a,a[i].b);
state[i]=1;
}
}
for(i=1;i<=m;i++){
cin>>b[i];
nen.pb(b[i]);
}
sort(all(nen));
nen.erase(unique(all(nen)),nen.end());
sz=nen.size();
for(i=1;i<=n;i++){
a[i].ida=lower_bound(all(nen),a[i].a)-nen.begin()+1;
a[i].idb=lower_bound(all(nen),a[i].b)-nen.begin()+1;
}
for(i=1;i<=m;i++){
b[i]=lower_bound(all(nen),b[i])-nen.begin()+1;
seg.update(1,1,sz,b[i],i);
}
for(i=1;i<=n;i++){
ma[a[i].id]=seg.get(1,1,sz,a[i].ida,a[i].idb-1);
if(ma[a[i].id])
ma[a[i].id]++;
}
sort(a+1,a+n+1,cmp);
ll cnt=1;
while(cnt<=n&&ma[a[cnt].id]>m)
cnt++;
for(i=m;i>=1;i--){
seg.update1(1,1,sz,b[i]);
while(cnt<=n&&ma[a[cnt].id]==i){
out[a[cnt].id]=seg.get1(1,1,sz,a[cnt].idb,sz);
cnt++;
}
}
sort(a+1,a+n+1,cmp1);
ll ans=0;
for(i=1;i<=n;i++){
if(ma[i]>0&&ma[i]<=m){
ans+=(out[i]&1?a[i].a:a[i].b);
}
else if(!ma[i]){
out[i]=seg.get1(1,1,sz,a[i].idb,sz);
if(!state[i])
ans+=(out[i]&1?a[i].b:a[i].a);
else ans+=(out[i]&1?a[i].a:a[i].b);
}
else{
ans+=max(a[i].a,a[i].b);
}
// cout<<out[i]<<" "<<ans<<'\n';
}
cout<<ans;
}