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>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
 #define int long long

#define all(X) (X).begin(), (X).end()
#define reset(X) memset(X, 0, sizeof(X))
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define endl '\n'
#define fi first
#define se second


using namespace __gnu_pbds;
using namespace std;
const int mod=1e9+7;
 // const int mod=998244353;
 // const int mod=1e9+9;
const int INF=4e18+10;
// const int INF=4e18+10;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define read(n) int n; cin>>n;
#define readv(x, n) vector<int> x(n); for(auto &i:x) cin>>i;


typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef pair<int, int> pii;

template<typename T1,typename T2>
void set_min(T1& a, T2 b)
{
    a=min(a, (T1)b);
}


int multiply(int a, int b, int in_mod){return (a*b)%in_mod;}
int mult_identity(int a){return 1;}


auto power(auto a, int b, int in_mod)
{
    auto prod=mult_identity(a);
    auto mult=a%in_mod;
    while(b!=0)
    {
        if(b%2)
        {
            prod=multiply(prod,mult, in_mod);

        }
        mult=multiply(mult, mult,in_mod);
        b/=2;
    }
    return prod;
}
int mod_inv(int q, int in_mod)
{

    return power(q, in_mod-2,in_mod);
}

void precomp()
{
}

int f(int mid, auto bad_life, auto g, auto n, auto k)
{
    //first find one with maximum fuel;
    int mx_fuel = 0;
    for(int i=0;i<=mid;i++)
    {
        mx_fuel=max(mx_fuel, bad_life[i].se);
    }

    //now try to run the shortest path

    int time = 0;
    int last = 0;

    int sm = 0;
    for(int i=0;i<g.size();i++)
    {
        int dist = g[i] - last;

        int fuel = mx_fuel;

        //I want to run a binary search but complexity wont support this, so let me build a normal algo to solve this algorithm

        if(fuel<dist)
        {
            return INF;
        }
        else if(fuel>=2*dist)
        {
            time += dist;
        }
        else
        {
            //solve the equations 2*x +  y= fuel, x + 2*y = dist

            //well maybe its easirt than that, no need to solve equation
            int time_diff = 2*dist - (fuel%dist);
            time +=time_diff;

        }




        last = g[i];

    }
    return time;



}

void solve()
{
    int n, k, s, t;
    cin>>n>>k>>s>>t;
    vector<int> c(n);
    vector<int> v(n);
    for(int i=0;i<n;i++)
    {
        cin>>c[i]>>v[i];
    }
    vector<pair<int, int> > real_life_is_well_life;
    for(int i=0;i<n;i++)
    {
        real_life_is_well_life.pb({c[i], v[i]});
    }
    sort(all(real_life_is_well_life));
    vector<int> g(k);
    for(int i=0;i<k;i++)
    {
        cin>>g[i];
    }
    g.pb(s);
    sort(all(g));

    //sadly binary search again, something that I dont really lik


    int lo = 0, hi = n-1;
    while(lo<hi)
    {
        int mid = (lo+hi)/2;



        if(f(mid, real_life_is_well_life, g,n, k)<=t)
        {
            hi = mid;
        }
        else
        {
            lo = mid+1;
        }
    }

    //find the minimum
    cout<<real_life_is_well_life[lo].fi<<endl;
}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
#ifndef ONLINE_JUDGE
    if (fopen("INPUT.txt", "r"))
    {
        freopen("INPUT.txt", "r", stdin);
        freopen("OUTPUT.txt", "w", stdout);
    }
#endif
    auto clk = clock();
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    // -------------------------------------Code starts here---------------------------------------------------------------------
    precomp();
    int t = 1;
    // cin>>t;

    for (int test = 1; test <= t; test++)
    {
        // cout<<"Case #"<<test<<": ";
        // cout<<endl;
        solve();

        // cout<<endl;
    }

    // -------------------------------------Code ends here------------------------------------------------------------------

    clk = clock() - clk;
    // cerr << fixed << setprecision(6) << "Time: " << ((long double)clk) / CLOCKS_PER_SEC << "\n";
    return 0;
}
