#include <bits/stdc++.h>
using namespace std;
int n, m, p, q;
struct dish{
int deli, price;
}a[200002];
int pDown[50005], qUp[50005];
bool comp1(dish a, dish b){
return a.deli > b.deli;
}
struct comp2{
bool operator()(dish a, dish b){
return a.price < b.price;
}
};
priority_queue<dish, vector<dish> , comp2> qu;
bool check(int weeks){
if((long long)((n-p-q)*weeks) >= m) return true;
while(!qu.empty()) qu.pop();
int now = 0;
for(int i=0; i<p; i++){
for(int j=0; j<weeks; j++){
if(now<m && a[now].deli >= pDown[i])
now++;
else break;
}
}
for(int i=now; i<m; i++){
qu.push(a[i]);
}
for(int i=0; i<q; i++){
for(int j=0; j<weeks; j++){
if(!qu.empty() && a[now].price <= qUp[i])
qu.pop();
else break;
}
}
int remants = qu.size();
return (long long)((n-p-q)*weeks) >= remants;
}
int ans = -1;
int search(int left, int right){
int mid;
while(right > left + 1){
mid = (left + right) / 2;
if(check(mid)){
ans = mid;
right = mid;
}
else{
left = mid;
}
}
return right;
}
signed main(){
cin >> n >> m >> p >> q;
for(int i=0; i<m; i++){
cin >> a[i].deli >> a[i].price;
}
for(int i=0; i<p; i++){
cin >> pDown[i];
}
for(int i=0; i<q; i++){
cin >> qUp[i];
}
sort(a, a+m, comp1);
sort(pDown, pDown+p, greater<int>());
sort(qUp, qUp+q);
search(0, m+1);
cout << ans;
return 0;
}