#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
if(!(cin >> N)) return 0;
vector<long long> L(N), R(N);
for (int i = 0; i < N; ++i) cin >> L[i] >> R[i];
int M; cin >> M;
vector<long long> A(M+1);
for (int i = 1; i <= M; ++i) cin >> A[i];
// sort by L and build prefix max of R
vector<pair<long long,long long>> seg(N);
for(int i=0;i<N;++i) seg[i]={L[i],R[i]};
sort(seg.begin(), seg.end());
vector<long long> Ls(N), prefMaxR(N);
for (int i=0;i<N;++i){
Ls[i]=seg[i].first;
prefMaxR[i]=seg[i].second;
if(i) prefMaxR[i]=max(prefMaxR[i], prefMaxR[i-1]);
}
auto bestR = [&](long long x)->long long{
int idx = upper_bound(Ls.begin(), Ls.end(), x) - Ls.begin() - 1;
if (idx < 0) return LLONG_MIN/4; // không có L <= x
return prefMaxR[idx];
};
// two pointers + deques for min/max
deque<pair<long long,int>> dqMin, dqMax;
auto add = [&](int idx){
long long v=A[idx];
while(!dqMin.empty() && dqMin.back().first>=v) dqMin.pop_back();
dqMin.emplace_back(v, idx);
while(!dqMax.empty() && dqMax.back().first<=v) dqMax.pop_back();
dqMax.emplace_back(v, idx);
};
auto eraseIdx = [&](int idx){
if(!dqMin.empty() && dqMin.front().second==idx) dqMin.pop_front();
if(!dqMax.empty() && dqMax.front().second==idx) dqMax.pop_front();
};
int r=0;
vector<int> far(M+2, 0);
for(int l=1; l<=M; ++l){
while(r+1<=M){
add(r+1);
long long mn=dqMin.front().first;
long long mx=dqMax.front().first;
if(mx <= bestR(mn)) ++r; // vẫn hợp lệ, mở rộng
else { // không hợp lệ, hoàn tác
eraseIdx(r+1);
break;
}
}
far[l]=r;
eraseIdx(l);
}
int segments = 0;
int pos = 1;
while(pos <= M){
if(far[pos] < pos){ cout << -1 << '\n'; return 0; }
++segments;
pos = far[pos] + 1;
}
cout << (segments - 1) << '\n'; // số lần đổi nguyên liệu
return 0;
}