#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <tuple>
#include <math.h>
#include <cstring>
#include <bitset>
#include <set>
#include <map>
#define int long long
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define endl '\n'
#define f first
#define s second
#define all(x) begin(x),end(x)
#define m_p make_pair
int const INF = 1e18+7;
signed main(){
int n;cin >> n;
int m;cin >> m;
vector<pii> vc1;
vector<int> vc2;
for(int i{};i < n;i++){
int a,b;cin >> a >> b;
vc1.emplace_back(a,b);
}
for(int i{};i < m;i++){
int a;cin >> a;
vc2.emplace_back(a);
}
sort(all(vc2));
sort(all(vc1));
priority_queue<int,vector<int>,greater<int>> pq;
vector<int> vc;
int cur = 0;
for(int i{};i < m;i++){
int it = (upper_bound(all(vc1),m_p(vc2[i],INF))-vc1.begin())-1;
//cout << it << endl;
for(int i{cur};i <= it;i++){
pq.emplace(vc1[i].s);
}
cur = it+1;
if(!pq.empty()){
vc.emplace_back(pq.top());
pq.pop();
}
}
vector<int> lis = {0};
for(auto k:vc){
auto it = upper_bound(all(lis),k);
if(it == lis.end()) lis.emplace_back(k);
else *it = k;
}
cout << lis.size()-1;
}