#include<bits/stdc++.h>
#define maxn 50005
#define maxm 200005
#define int long long
#define F(_i,_j,_k) for(int _i=_j;_i<=_k;_i++)
#define AF(_i,_b) for(;_b;_i++)
#define W(_b) while(_b)
using namespace std;
struct veg{
int grt,prc;
bool operator<(const veg&C)const{
return grt>C.grt;
}
}a[maxm];
int n,m,p,q,b[maxn],c[maxn],L=0,R=maxm;
signed main(){
cin>>n>>m>>p>>q;
if(m==0){
cout<<0;
return 0;
}
F(i,1,m)cin>>a[i].grt>>a[i].prc;
F(i,1,p)cin>>b[i];
F(i,1,q)cin>>c[i];
sort(a+1,a+m+1);
sort(b+1,b+p+1);
reverse(b+1,b+p+1);
sort(c+1,c+q+1);
reverse(c+1,c+p+1);
W(L<R-1){
int tot=1,mid=(L+R)/2,cnt=0;
priority_queue<int>Z;
F(i,1,m){
AF(tot,tot<=p&&b[tot]>a[i].grt){
F(o,1,mid){
if(Z.empty())break;
Z.pop();
}
}
Z.push(a[i].prc);
}
AF(tot,tot<=p){
F(o,1,mid){
if(Z.empty())break;
Z.pop();
}
}
F(i,1,q){
W(c[i]<Z.top()&&Z.size()>0){
Z.pop();
cnt++;
}
F(o,1,mid){
if(Z.empty())break;
Z.pop();
}
}
if((n-p-q)*mid>=cnt+Z.size())R=mid;
else L=mid;
}
if(R==maxm)cout<<-1;
else cout<<R;
return 0;
}