1 1 2 2
1000000000 1000000000
1
 1 1 1000000000 1000000000
100 1000000000
1
 1 1 10 18
5 6
5
 2 1 1000000000 2000000000
111 999999999
101 999999998
1
 4 13 400 600
13 30
1 19
1 160
1 113
58 73 15 319 194 362 128 157 336 162 77 90 96
 1 15 100 200
283 8
30 58 16 45 80 82 55 95 24 23 86 28 51 47 20
 3 2 300 400
24 68
13 65
15 113
127 177
 1 1 2 1
1 10
1
 4 2 7 15
10 9
4 4
9 3
4 10
1 6
 2 1 1000000000 2000000000
111 1000000000
101 1000000000
5
 2 1 1000000000 2000000000
111 999999998
101 999999998
1
 1 1 1000000000 1000000000
1 1000000000
1

1000000000
 -1
 5
 111
 1
 -1
 -1
 -1
 4
 101
 -1
 -1

#include<bits/stdc++.h>
#define pr(x) cerr << "\n" << (#x) << " is " << (x) << endl
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define ull unsigned long long
#define Toggle(n,i) (n^(1<<i))
#define Check(n,i) (n&(1<<i))
#define Set(n,i) (n|(1<<i))
#define Reset(n,i) (n&(~(1<<i)))
#define fo(i,x,y) for(int i=(x);i<=(y);++i)
#define me(arr,val) memset(arr,val,sizeof arr)
#define inf 10e8
#define infl LLONG_MAX
#define mod 1000000007
#define f first
#define s second
#define  g(t,a)  (get<a>(t))
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
//int dx[]={+1,-1,0,0};//vertical horizontal
//int dy[]={0,0,+1,-1};//vertical horizontal
//int dx[]={+1,+1,-1,-1,+2,-2,+2,-2};//knights move
//int dy[]={+2,-2,+2,-2,+1,+1,-1,-1};//knights move
//int dx[]={+1,-1,0,0,+1,+1,-1,-1};//vertical horizontal diagonal
//int dy[]={0,0,+1,-1,-1,+1,+1,-1};//vertical horizontal diagonal
using namespace std;
using namespace __gnu_pbds;
/*typedef tree<int, null_type,less<int>, rb_tree_tag,
             tree_order_statistics_node_update>indexed_set;
for set use above*/
typedef tree<pair<int,int>, null_type,less_equal<pair<int, int>>, rb_tree_tag,
tree_order_statistics_node_update> indexed_multiset;


ll n,k,s,t;
ll j;
ll a[200005][2],station[200005];
bool possible(ll capacity)
{
    ll time=0;
    for(int i=0;i<=k;++i)
    {
        ll dist=station[i+1]-station[i];
        ll y=capacity-dist;
        ll x=dist-y;
        if(y<0)
        {
            return false;
        }
        if(y>=dist)
        {
            time+=dist;
        }
        else
        {
            time+=y+2*x;
        }
    }
    if(time<=t)
    {
        return true;
    }
    return false;
}
ll bin_search()
{
    ll s=1,e=j,ans=inf+1;
    while(s<=e)
    {
        ll mid=(s+e)/2;
        if(possible(a[mid][1]))
        {
            ans=a[mid][0];
            e=mid-1;
        }
        else
        {
            s=mid+1;
        }
    }
    return ans;
}
int main()
{
    scanf("%lld%lld%lld%lld",&n,&k,&s,&t);
    set<pair<ll,ll> >st;
    ll cost,cap;
    scanf("%lld%lld",&cost,&cap);
    st.insert({cost,cap});
    for(int i=1;i<n;++i)
    {
        scanf("%lld%lld",&cost,&cap);
        pair<ll,ll>p=*st.lower_bound({cost,-inf});
        if(p.f==cost)
        {
            st.erase({p.f,p.s});
            st.insert({p.f,max(p.s,cap)});
        }
        else
        {
            st.insert({cost,cap});
        }
    }
    for(int i=1;i<=k;++i)
    {
        scanf("%lld",&station[i]);
    }
    sort(station+1,station+k+1);
    station[k+1]=s;
    for(auto it:st)
    {
        a[++j][0]=it.f;
        a[j][1]=it.s;
    }
    ll ret=bin_search();
    if(ret==inf+1)
    {
        printf("-1");
    }
    else
    {
        printf("%lld",ret);
    }
    return 0;
}

