const bool is_testing = 0;

#include <bits/stdc++.h>

#define endl '\n'

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int INF = 0x7FFFFFFF;

bool compv(pii p1, pii p2) {
    return p1.second < p2.second;
}

const int MAX_K = int(2 * 1e5 + 2);
int k;
vector<ll> stops(MAX_K, -1);
const int MAX_V = int(1e9 + 1);
//vector<ll> mem(MAX_V, -1);

ll f(int v) {
//    if (mem[v] != -1) return mem[v];
    int i = 0;

    int res = 0;
    while (i < stops.size()-1) {
        ll dist = stops[i+1] - stops[i];
        if (dist > v) return INF;

        ll l = 0, r = dist, m;
        while (l < r) {
            m = l + (r-l)/2;
            if (2 * m + (dist-m) < v)
                l = m+1;
            else
                r = m;
        }
        res += l + 2 * (dist - l);
        i++;
    }
//    mem[v] = res;
    return res;
}

int main() {
    if (is_testing)
        freopen("/home/birdi/cpp/in.txt", "r", stdin);
    ll n, s, t;
    cin >> n >> k >> s >> t;
    stops.resize(k+2);
    vector<pii> v(n);

    for (int i = 0; i < n; ++i) {
        cin >> v[i].first >> v[i].second;
    }

    stops[0] = 0;
    for (int i = 1; i <= k; ++i) {
        cin >> stops[i];
    }
    stops[k+1] = s;

    sort(stops.begin(), stops.end());
    ll max_len = -1;
    for (int i = 0; i < stops.size()-1; ++i) {
        max_len = max(max_len, stops[i + 1] - stops[i]);
    }

    int min_cost = INF;
    for (pii car : v) {
        if (car.second >= max_len && f(car.second) <= t) min_cost = min(min_cost, car.first);
    }

    if (min_cost < INF)
        cout << min_cost;
    else cout << -1;
    return 0;
}


const bool is_testing = 0;

#include <bits/stdc++.h>

#define endl '\n'

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int INF = 0x7FFFFFFF;

bool compv(pii p1, pii p2) {
    return p1.second < p2.second;
}

const int MAX_K = int(2 * 1e5 + 2);
int k;
vector<ll> stops(MAX_K, -1);

ll f(int v) {
    int i = 0;

    int res = 0;
    while (i < stops.size()-1) {
        ll dist = stops[i+1] - stops[i];
        if (dist > v) return INF;

        ll l = 0, r = dist, m;
        while (l < r) {
            m = l + (r-l)/2;
            if (2 * m + (dist-m) < v)
                l = m+1;
            else
                r = m;
        }
        res += l + 2 * (dist - l);
        i++;
    }
    return res;
}

int main() {
    if (is_testing)
        freopen("/home/birdi/cpp/in.txt", "r", stdin);
    ll n, s, t;
    cin >> n >> k >> s >> t;
    stops.resize(k+2);
    vector<pii> v(n);

    for (int i = 0; i < n; ++i) {
        cin >> v[i].first >> v[i].second;
    }

    stops[0] = 0;
    for (int i = 1; i <= k; ++i) {
        cin >> stops[i];
    }
    stops[k+1] = s;

    sort(stops.begin(), stops.end());
    ll max_len = -1;
    for (int i = 0; i < stops.size()-1; ++i) {
        max_len = max(max_len, stops[i + 1] - stops[i]);
    }

    int min_cost = INF;
    for (pii car : v) {
        if (car.second >= max_len && f(car.second) <= t) min_cost = min(min_cost, car.first);
    }

    if (min_cost < INF)
        cout << min_cost;
    else cout << -1;
    return 0;
}


const bool is_testing = 0;

#include <bits/stdc++.h>

#define endl '\n'

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int INF = 0x7FFFFFFF;

bool compv(pii p1, pii p2) {
    return p1.second < p2.second;
}

const int MAX_K = int(2 * 1e5 + 2);
int k;
vector<ll> stops(MAX_K, -1);
const int MAX_V = int(1e9 + 1);

ll f(int v) {
    int i = 0;

    int res = 0;
    while (i < stops.size()-1) {
        ll dist = stops[i+1] - stops[i];
        if (dist > v) return INF;

        ll l = 0, r = dist, m;
        while (l < r) {
            m = l + (r-l)/2;
            if (2 * m + (dist-m) < v)
                l = m+1;
            else
                r = m;
        }
        res += l + 2 * (dist - l);
        i++;
    }
    return res;
}

int main() {
    if (is_testing)
        freopen("/home/birdi/cpp/in.txt", "r", stdin);
    ll n, s, t;
    cin >> n >> k >> s >> t;
    stops.resize(k+2);
    vector<pii> cars(n);

    for (int i = 0; i < n; ++i) {
        cin >> cars[i].second >> cars[i].first;
    }

    stops[0] = 0;
    for (int i = 1; i <= k; ++i) {
        cin >> stops[i];
    }
    stops[k+1] = s;

    sort(stops.begin(), stops.end());
    ll max_len = -1;
    for (int i = 0; i < stops.size()-1; ++i) {
        max_len = max(max_len, stops[i + 1] - stops[i]);
    }

    sort(cars.begin(), cars.end());

    int left_bound = 0;
    if (cars.size() > 10000) {
        ll l = 0, r = cars.size()-1, m;
        while (l < r) {
            m = l + (r-l) / 2;
            if (f(cars[m].first) != INF)
                r = m-1;
            else
                l = m;
        }
        left_bound = (r == 0) ? r : r+1;
    }

    int min_cost = INF;
    for (int i = left_bound; i < cars.size(); ++i) {
        if (f(cars[i].first) <= t) min_cost = min(min_cost, cars[i].second);
    }

    if (min_cost < INF)
        cout << min_cost;
    else cout << -1;
    return 0;
}


#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
using namespace std;
#define forall(i,n) for(int i=0;i<n;i++)
#define sc(t) scanf("%d",&t)
#define pr(x) printf("%d\n",x)
#define MOD 1000000007
#define pb(x) push_back(x)
#define mp(a,b) make_pair(a,b)
#define INF 1<<28
#define ll long long
#define scll(x) scanf("%I64d",&x)
#define prll(x) printf("%I64d\n",x)
#define pii pair<int,int>
void fast(int &x)
{
	register int c=getchar();
	x=0;
	int neg=0;
	for(;((c<48||c>57)&&c!='-');c=getchar());
	if(c=='-')
	{
		neg=1;
		c=getchar();
	}
	for(;c>47&&c<58;c=getchar())
	{
		x=(x<<1)+(x<<3)+c-48;
	}
	if(neg)
		x=-x;
}
int A[200005],B[200005],C[200005];
int n,k,s,t;
bool solve(int x)
{
	int time=0;
	for(int i=1;i<=k+1;i++)
	{
		if(A[i]-A[i-1]>x)
			return false;
		if(2*(A[i]-A[i-1])<=x)
			time+=A[i]-A[i-1];
		else
			time+=(3*(A[i]-A[i-1]))-x;
	}
	if(time>t)
		return false;
	return true;
}
int main()
{

	cin>>n>>k>>s>>t;
	forall(i,n)
	{
		cin>>B[i]>>C[i];
	}
	A[0]=0;
	for(int i=1;i<=k;i++)
	{
		cin>>A[i];
	}
	A[k+1]=s;
	sort(A,A+k+1);
	int lo=1;
	int hi=1e9+8;
	int mid;
	while(lo<hi)
	{
		mid=(lo+hi)/2;
		if(solve(mid))
			hi=mid;
		else
			lo=mid+1;
	}
	int ans=1e9+8;
	for(int i=0;i<n;i++)
	{
		if(C[i]>=lo&&B[i]<ans)
			ans=B[i];
	}
	if(ans==1e9+8)
		cout<<"-1"<<endl;
	else
		cout<<ans<<endl;
	return 0;
}


#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
using namespace std;
#define forall(i,n) for(int i=0;i<n;i++)
#define sc(t) scanf("%d",&t)
#define pr(x) printf("%d\n",x)
#define MOD 1000000007
#define pb(x) push_back(x)
#define mp(a,b) make_pair(a,b)
#define INF 1<<28
#define ll long long
#define scll(x) scanf("%I64d",&x)
#define prll(x) printf("%I64d\n",x)
#define pii pair<int,int>
void fast(int &x)
{
	register int c=getchar();
	x=0;
	int neg=0;
	for(;((c<48||c>57)&&c!='-');c=getchar());
	if(c=='-')
	{
		neg=1;
		c=getchar();
	}
	for(;c>47&&c<58;c=getchar())
	{
		x=(x<<1)+(x<<3)+c-48;
	}
	if(neg)
		x=-x;
}
int A[200005],B[200005],C[200005];
int n,k,s,t;
bool solve(int x)
{
	int time=0;
	for(int i=1;i<=k+1;i++)
	{
		if(A[i]-A[i-1]>x)
			return false;
		if(2*(A[i]-A[i-1])<=x)
			time+=A[i]-A[i-1];
		else
			time+=(3*(A[i]-A[i-1]))-x;
	}
	if(time>t)
		return false;
	return true;
}
int main()
{

	cin>>n>>k>>s>>t;
	forall(i,n)
	{
		sc(B[i]);
		sc(C[i]);
	}
	A[0]=0;
	for(int i=1;i<=k;i++)
	{
		sc(A[i]);
	}
	A[k+1]=s;
	sort(A,A+k+1);
	int lo=1;
	int hi=1e9+8;
	int mid;
	while(lo<hi)
	{
		mid=(lo+hi)/2;
		if(solve(mid))
			hi=mid;
		else
			lo=mid+1;
	}
	int ans=1e9+8;
	for(int i=0;i<n;i++)
	{
		if(C[i]>=lo&&B[i]<ans)
			ans=B[i];
	}
	if(ans==1e9+8)
		cout<<"-1"<<endl;
	else
		cout<<ans<<endl;
	return 0;
}


#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
using namespace std;
#define forall(i,n) for(int i=0;i<n;i++)
#define sc(t) scanf("%d",&t)
#define pr(x) printf("%d\n",x)
#define MOD 1000000007
#define pb(x) push_back(x)
#define mp(a,b) make_pair(a,b)
#define INF 1<<28
#define ll long long
#define scll(x) scanf("%I64d",&x)
#define prll(x) printf("%I64d\n",x)
#define pii pair<int,int>
void fast(int &x)
{
	register int c=getchar();
	x=0;
	int neg=0;
	for(;((c<48||c>57)&&c!='-');c=getchar());
	if(c=='-')
	{
		neg=1;
		c=getchar();
	}
	for(;c>47&&c<58;c=getchar())
	{
		x=(x<<1)+(x<<3)+c-48;
	}
	if(neg)
		x=-x;
}
map<int,int> m1;
int A[200005];
int main()
{
	int n,k,s,t;
	cin>>n>>k>>s>>t;
	forall(i,n)
	{
		int x,y;
		cin>>x>>y;
		if(m1[y]>0)
		{
			if(m1[y]>x)
				m1[y]=x;

		}
		else
			m1[y]=x;
	}
	forall(i,k)
	{
		cin>>A[i];
	}
	if(s==t)
	{
		int max=-1;
		for(int i=1;i<k;i++)
		{
			if((A[i]-A[i-1])>max)
			{
				max=A[i]-A[i-1];
			}

		}
		if((s-A[k-1])>max)
			max=s-A[k-1];
		max=max*2;
		for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
		{
			if(it->first>=max)
			{
				cout<<it->second<<endl;
				return 0;
			}
		}

	}
	else if(s>t)
	{
		cout<<"-1"<<endl;
		return 0;
	}
	else
	{
		int ex=(t-s);
		int max=-1;
		for(int i=1;i<k;i++)
		{
			if((A[i]-A[i-1])>max)
			{
				max=A[i]-A[i-1];
			}

		}
		if((s-A[k-1])>max)
			max=s-A[k-1];
		int res=(2*max)-ex;
		for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
		{
			if(it->first>=res)
			{
				cout<<it->second<<endl;
				return 0;
			}
		}

	}
	return 0;
}


#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
using namespace std;
#define forall(i,n) for(int i=0;i<n;i++)
#define sc(t) scanf("%d",&t)
#define pr(x) printf("%d\n",x)
#define MOD 1000000007
#define pb(x) push_back(x)
#define mp(a,b) make_pair(a,b)
#define INF 1<<28
#define ll long long
#define scll(x) scanf("%I64d",&x)
#define prll(x) printf("%I64d\n",x)
#define pii pair<int,int>
void fast(int &x)
{
	register int c=getchar();
	x=0;
	int neg=0;
	for(;((c<48||c>57)&&c!='-');c=getchar());
	if(c=='-')
	{
		neg=1;
		c=getchar();
	}
	for(;c>47&&c<58;c=getchar())
	{
		x=(x<<1)+(x<<3)+c-48;
	}
	if(neg)
		x=-x;
}
map<int,int> m1;
int A[200005];
int main()
{
	int n,k,s,t;
	cin>>n>>k>>s>>t;
	forall(i,n)
	{
		int x,y;
		cin>>x>>y;
		if(m1[y]>0)
		{
			if(m1[y]>x)
				m1[y]=x;

		}
		else
			m1[y]=x;
	}
	forall(i,k)
	{
		cin>>A[i];
	}
	if(s==t)
	{
		int max=-1;
		for(int i=1;i<k;i++)
		{
			if((A[i]-A[i-1])>max)
			{
				max=A[i]-A[i-1];
			}

		}
		if((s-A[k-1])>max)
			max=s-A[k-1];
		max=max*2;
		int flag=0;
		for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
		{
			if(it->first>=max)
			{
				flag=1;
				cout<<it->second<<endl;
				return 0;
			}
		}
		if(flag==0)
			cout<<"-1"<<endl;

	}
	else if(s>t)
	{
		cout<<"-1"<<endl;
		return 0;
	}
	else
	{
		int ex=(t-s);
		int max=-1;
		for(int i=1;i<k;i++)
		{
			if((A[i]-A[i-1])>max)
			{
				max=A[i]-A[i-1];
			}

		}
		if((s-A[k-1])>max)
			max=s-A[k-1];
		int res=(2*max)-ex;
		int flag=0;
		for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
		{
			if(it->first>=res)
			{
				flag=1;
				cout<<it->second<<endl;
				return 0;
			}
		}
		if(flag==0)
			cout<<"-1"<<endl;

	}
	return 0;
}


#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
using namespace std;
#define forall(i,n) for(int i=0;i<n;i++)
#define sc(t) scanf("%d",&t)
#define pr(x) printf("%d\n",x)
#define MOD 1000000007
#define pb(x) push_back(x)
#define mp(a,b) make_pair(a,b)
#define INF 1<<28
#define ll long long
#define scll(x) scanf("%I64d",&x)
#define prll(x) printf("%I64d\n",x)
#define pii pair<int,int>
void fast(int &x)
{
	register int c=getchar();
	x=0;
	int neg=0;
	for(;((c<48||c>57)&&c!='-');c=getchar());
	if(c=='-')
	{
		neg=1;
		c=getchar();
	}
	for(;c>47&&c<58;c=getchar())
	{
		x=(x<<1)+(x<<3)+c-48;
	}
	if(neg)
		x=-x;
}
map<int,int> m1;
int A[200005],B[200005],C[200005];
int main()
{
	int n,k,s,t;
	cin>>n>>k>>s>>t;
	forall(i,n)
	{
		int x,y;
		cin>>x>>y;
		if(m1[y]>0)
		{
			if(m1[y]>x)
				m1[y]=x;

		}
		else
			m1[y]=x;
	}

	int o=0;
	for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
	{
		B[o]=it->second;
		o++;
	}

	for(int i=o-1;i>=0;i--)
	{
		if(i==o-1)
			C[i]=B[i];
		else
		{
			C[i]=min(B[i],C[i+1]);
		}
	}
	forall(i,k)
	{
		cin>>A[i];
	}
	if(s==t)
	{
		int max=-1;
		for(int i=1;i<k;i++)
		{
			if((A[i]-A[i-1])>max)
			{
				max=A[i]-A[i-1];
			}

		}
		if((s-A[k-1])>max)
			max=s-A[k-1];
		max=max*2;
		int flag=0;
		int h=0;
		for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
		{
			if(it->first>=max)
			{
				flag=1;
				break;
			}
			h++;
		}
		if(flag==1)
		{
			cout<<C[h]<<endl;
		}
		else
			cout<<"-1"<<endl;

	}
	else if(s>t)
	{
		cout<<"-1"<<endl;
		return 0;
	}
	else
	{
		int ex=(t-s);
		int max=-1;
		for(int i=1;i<k;i++)
		{
			if((A[i]-A[i-1])>max)
			{
				max=A[i]-A[i-1];
			}

		}
		if((s-A[k-1])>max)
			max=s-A[k-1];
		int res=(2*max)-ex;
		int flag=0;
		int h=0;
		for(map<int,int>::iterator it=m1.begin();it!=m1.end();it++)
		{
			if(it->first>=res)
			{
				flag=1;
				break;
			}
			h++;
		}
		if(flag==1)
		{
			cout<<C[h]<<endl;
		}
		else
			cout<<"-1"<<endl;

	}
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5+10;
int n, k;
LL p[N], s, t;
struct P
{
    LL C, V;
}car[N];

bool cmp(P a, P b)
{
    if(a.V != b.V) return a.V < b.V;
    return a.C < b.C;
}

int check(LL x)
{
    LL sum_t = 0;
    for(int i=1; i<=k+1; i++)
    {
        //printf("%I64d %I64d\n", p[i]-p[i-1], x);
        if(p[i]-p[i-1] > x) return 0;
        if(2*(p[i]-p[i-1]) < x)
            sum_t += (p[i]-p[i-1]);
        else
            sum_t += (3*(p[i]-p[i-1])-x);
        //printf("%d\n", sum_t);
        if(sum_t > t) return 0;
    }

    return 1;
}
int main()
{
    scanf("%d%d%I64d%I64d", &n, &k, &s, &t);
    for(int i=1; i<=n; i++)
        scanf("%I64d%I64d", &car[i].C, &car[i].V);
    for(int i=1; i<=k; i++)
        scanf("%I64d", &p[i]);
    p[0] = 0; p[k+1] = s;
    sort(car+1, car+1+n, cmp);
    sort(p, p+1+n);
//    for(int i=0; i<=k+1; i++)
//        printf("%I64d ", p[i]);
//    printf("\n");
    if(!check(car[n].V))
    {
        printf("-1\n");
        return 0;
    }

    int L=1, R=n;
    while(L < R)
    {
        int mid = (L+R)/2;
        if(check(car[mid].V))
            R = mid;
        else
            L = mid+1;
    }

    LL min_V = car[L].V;
    LL ans = 2e9+10;
    for(int i=1; i<=n; i++)
    {
        if(car[i].C<ans && car[i].V>=min_V)
            ans = car[i].C;
    }
    printf("%I64d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5+10;
int n, k;
LL p[N], s, t;
struct P
{
    LL C, V;
}car[N];

bool cmp(P a, P b)
{
    if(a.V != b.V) return a.V < b.V;
    return a.C < b.C;
}

int check(LL x)
{
    LL sum_t = 0;
    for(int i=1; i<=k+1; i++)
    {
        //printf("%I64d %I64d\n", p[i]-p[i-1], x);
        if(p[i]-p[i-1] > x) return 0;
        if(2*(p[i]-p[i-1]) < x)
            sum_t += (p[i]-p[i-1]);
        else
            sum_t += (3*(p[i]-p[i-1])-x);
        //printf("%d\n", sum_t);
        if(sum_t > t) return 0;
    }

    return 1;
}
int main()
{
    scanf("%d%d%I64d%I64d", &n, &k, &s, &t);
    for(int i=1; i<=n; i++)
        scanf("%I64d%I64d", &car[i].C, &car[i].V);
    for(int i=1; i<=k; i++)
        scanf("%I64d", &p[i]);
    p[0] = 0; p[k+1] = s;
    sort(car+1, car+1+n, cmp);
    sort(p, p+1+k);
//    for(int i=0; i<=k+1; i++)
//        printf("%I64d ", p[i]);
//    printf("\n");
    if(!check(car[n].V))
    {
        printf("-1\n");
        return 0;
    }

    int L=1, R=n;
    while(L < R)
    {
        int mid = (L+R)/2;
        if(check(car[mid].V))
            R = mid;
        else
            L = mid+1;
    }

    LL min_V = car[L].V;
    LL ans = 2e9+10;
    for(int i=1; i<=n; i++)
    {
        if(car[i].C<ans && car[i].V>=min_V)
            ans = car[i].C;
    }
    printf("%I64d\n", ans);

    return 0;
}


/// CF 738 C
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n, k, s, t, p[N];
struct P
{
    int C, V;
}car[N];

bool cmp(P a, P b)
{
    if(a.V != b.V) return a.V < b.V;
    return a.C < b.C;
}

int check(int x)
{
    int sum_t = 0;
    for(int i=1; i<=k+1; i++)
    {
        if(p[i]-p[i-1] > x) return 0;
        if(3*(p[i]-p[i-1])-x < p[i]-p[i-1])
            sum_t += (p[i]-p[i-1]);
        else
            sum_t += (3*(p[i]-p[i-1])-x);
        //printf("%d\n", sum_t);
        if(sum_t > t) return 0;

    }

    return 1;
}
int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);
    for(int i=1; i<=n; i++)
        scanf("%d%d", &car[i].C, &car[i].V);
    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);
    p[0] = 0; p[k+1] = s;
    sort(car+1, car+1+n, cmp);
//    for(int i=1; i<=n; i++)
//        printf("%d ", car[i].V);
    int L=1, R=n;
    while(L < R)
    {
        int mid = (L+R)/2;
        if(check(car[mid].V))
            R = mid;
        else
            L = mid+1;
    }
    int min_V = car[L].V;

//    printf("%d\n", check(5));

    int ans = 1e9+10;
    for(int i=1; i<=n; i++)
    {
        if(car[i].C<ans && car[i].V>=min_V)
            ans = car[i].C;
    }
    printf("%d\n", ans);

    return 0;
}


/// CF 738 C
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5+10;
const LL INF = 2e9+10;
int n, k;
LL p[N], s, t;
struct P
{
    LL C, V;
}car[N];

bool cmp(P a, P b)
{
    if(a.V != b.V) return a.V < b.V;
    return a.C < b.C;
}

int check(LL x)
{
    LL sum_t = 0;
    for(int i=1; i<=k+1; i++)
    {
        //printf("%I64d %I64d\n", p[i]-p[i-1], x);
        if(p[i]-p[i-1] > x) return 0;
        if(2*(p[i]-p[i-1]) < x)
            sum_t += (p[i]-p[i-1]);
        else
            sum_t += (3*(p[i]-p[i-1])-x);
        //printf("%d\n", sum_t);
        if(sum_t > t) return 0;
    }

    return 1;
}
int main()
{
    scanf("%d%d%I64d%I64d", &n, &k, &s, &t);
    for(int i=1; i<=n; i++)
        scanf("%I64d%I64d", &car[i].C, &car[i].V);
    for(int i=1; i<=k; i++)
        scanf("%I64d", &p[i]);
    p[0] = 0; p[k+1] = s;
    sort(car+1, car+1+n, cmp);
    sort(p, p+1+k);
//    for(int i=0; i<=k+1; i++)
//        printf("%I64d ", p[i]);
//    printf("\n");

    LL L=1, R=INF;
    while(L < R)
    {
        LL mid = (L+R)/2;
        if(check(mid))
            R = mid;
        else
            L = mid+1;
    }

    LL ans = INF;
    for(int i=1; i<=n; i++)
    {
        if(car[i].C<ans && car[i].V>=L)
            ans = car[i].C;
    }
    if(ans == INF)
        printf("-1\n");
    else
        printf("%I64d\n", ans);

    return 0;
}


/// CF 738 C
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5+10;
int n, k;
LL p[N], s, t;
struct P
{
    LL C, V;
}car[N];

bool cmp(P a, P b)
{
    if(a.V != b.V) return a.V < b.V;
    return a.C < b.C;
}

int check(LL x)
{
    LL sum_t = 0;
    for(int i=1; i<=k+1; i++)
    {
        //printf("%I64d %I64d\n", p[i]-p[i-1], x);
        if(p[i]-p[i-1] > x) return 0;
        if(2*(p[i]-p[i-1]) < x)
            sum_t += (p[i]-p[i-1]);
        else
            sum_t += (3*(p[i]-p[i-1])-x);
        //printf("%d\n", sum_t);
        if(sum_t > t) return 0;
    }

    return 1;
}
int main()
{
    scanf("%d%d%I64d%I64d", &n, &k, &s, &t);
    for(int i=1; i<=n; i++)
        scanf("%I64d%I64d", &car[i].C, &car[i].V);
    for(int i=1; i<=k; i++)
        scanf("%I64d", &p[i]);
    p[0] = 0; p[k+1] = s;
    sort(car+1, car+1+n, cmp);
    for(int i=1; i<=k/2; i++)
        swap(p[i], p[k-i+1]);
//    for(int i=0; i<=k+1; i++)
//        printf("%I64d ", p[i]);
//    printf("\n");
    if(!check(car[n].V))
    {
        printf("-1\n");
        return 0;
    }

    int L=1, R=n;
    while(L < R)
    {
        int mid = (L+R)/2;
        if(check(car[mid].V))
            R = mid;
        else
            L = mid+1;
    }

    LL min_V = car[L].V;
    LL ans = 2e9+10;
    for(int i=1; i<=n; i++)
    {
        if(car[i].C<ans && car[i].V>=min_V)
            ans = car[i].C;
    }
    printf("%I64d\n", ans);

    return 0;
}


#include<iostream>
#include<string>
#define speed ios_base::sync_with_stdio(false);
#include<algorithm>
#define inf 2000100000
typedef long long int ll;
using namespace std;
ll n,k,s,t;
struct p{
	ll c;
	ll v;
};
bool comp(p p1,p p2)
{
	return p1.v<p2.v;
}
p pa[200010];
ll gas[200010];
ll time(int idx)
{
	ll rval=0;
	if(gas[0]>pa[idx].v)return inf;else rval+=(2*(gas[0])-min((pa[idx].v-gas[0]),gas[0]));
	for(int i=0;i<k;i++){
		if(gas[i+1]-gas[i]>pa[idx].v)return inf;else rval+=(2*(gas[i+1]-gas[i])-min((pa[idx].v+gas[i]-gas[i+1]),gas[i+1]-gas[i]));
	}
	return rval;
}
int main()
{
    speed
	cin>>n>>k>>s>>t;
	for(int i=0;i<n;i++)cin>>pa[i].c>>pa[i].v;
	for(int i=0;i<k;i++)cin>>gas[i];gas[k]=s;
	sort(gas,gas+k+1);
//	cout<<time(1)<<endl<<endl;
	sort(pa,pa+n,comp);
//	for(int i=0;i<n;i++)cout<<pa[i].c<<"  "<<pa[i].v<<endl;
	int l=0,r=n-1,mid;
	while(l<r)
	{
	  //   cout<<l<<" "<<r<<" "<<t<<endl;
		mid=l+(r-l)/2;
	//	cout<<"**"<<time(mid)<<"  "<<mid<<endl;
		if(time(mid)<=t)r=mid;
		else l=mid+1;
	}
	ll ans=inf;
	//cout<<l<<" "<<r<<endl;
	if(l==n-1)if(time(n-1)>t)l++;
	for(int i=l;i<n;i++)ans=min(ans,pa[i].c);
	if(ans==inf)cout<<"-1\n";else cout<<ans<<endl;
	return 0;
}


#include<iostream>
#include<string>
#include<algorithm>
#define inf 2000000000
typedef long long int ll;
using namespace std;
ll n,k,s,t;
struct p{
	ll c;
	ll v;
};
bool comp(p p1,p p2)
{
	return p1.v<p2.v;
}
p pa[200010];
ll gas[200010];
ll time(int idx)
{
	ll rval=0;
	if(gas[0]>pa[idx].v)return inf;else rval+=(2*(gas[0])-min((pa[idx].v-gas[0]),gas[0]));
	for(int i=0;i<k;i++){
		if(gas[i+1]-gas[i]>pa[idx].v)return inf;else rval+=(2*(gas[i+1]-gas[i])-min((pa[idx].v+gas[i]-gas[i+1]),gas[i+1]-gas[i]));
	}
	return rval;
}
int main()
{
    cin>>n>>k>>s>>t;
	for(int i=0;i<n;i++)cin>>pa[i].c>>pa[i].v;
	for(int i=0;i<k;i++)cin>>gas[i];gas[k]=s;
	sort(gas,gas+k+1);
	//cout<<time(1)<<endl<<endl;
	sort(pa,pa+n,comp);
//	for(int i=0;i<n;i++)cout<<pa[i].c<<"  "<<pa[i].v<<endl;
	int l=0,r=n-1,mid;
	while(l<r)
	{
	    // cout<<l<<" "<<r<<" "<<t<<endl;
		mid=l+(r-l)/2;
	//	cout<<"**"<<time(mid)<<"  "<<mid<<endl;
		if(time(mid)<=t)r=mid;
		else l=mid+1;
	}
	ll ans=inf;
	//cout<<l<<" "<<r<<endl;
	for(int i=l;i<n;i++)ans=min(ans,pa[i].c);
	cout<<ans<<endl;
	return 0;
}


#include<iostream>
#include<string>
#include<algorithm>
#define inf 2000000000
typedef long long int ll;
using namespace std;
ll n,k,s,t;
struct p{
	ll c;
	ll v;
};
bool comp(p p1,p p2)
{
	return p1.v<p2.v;
}
p pa[200010];
ll gas[200010];
ll time(int idx)
{
	ll rval=0;
	if(gas[0]>pa[idx].v)return inf;else rval+=(2*(gas[0])-min((pa[idx].v-gas[0]),gas[0]));
	for(int i=0;i<k;i++){
		if(gas[i+1]-gas[i]>pa[idx].v)return inf;else rval+=(2*(gas[i+1]-gas[i])-min((pa[idx].v+gas[i]-gas[i+1]),gas[i+1]-gas[i]));
	}
	return rval;
}
int main()
{
    cin>>n>>k>>s>>t;
	for(int i=0;i<n;i++)cin>>pa[i].c>>pa[i].v;
	for(int i=0;i<k;i++)cin>>gas[i];gas[k]=s;
	sort(gas,gas+k+1);
	//cout<<time(1)<<endl<<endl;
	sort(pa,pa+n,comp);
//	for(int i=0;i<n;i++)cout<<pa[i].c<<"  "<<pa[i].v<<endl;
	int l=0,r=n-1,mid;
	while(l<r)
	{
	    // cout<<l<<" "<<r<<" "<<t<<endl;
		mid=l+(r-l)/2;
	//	cout<<"**"<<time(mid)<<"  "<<mid<<endl;
		if(time(mid)<=t)r=mid;
		else l=mid+1;
	}
	ll ans=inf;
	//cout<<l<<" "<<r<<endl;
	if(l==n-1)if(time(n-1)>t)l++;
	for(int i=l;i<n;i++)ans=min(ans,pa[i].c);
	if(ans==inf)cout<<"-1\n";else cout<<ans<<endl;
	return 0;
}


#include<iostream>
#include<string>
#define speed ios_base::sync_with_stdio(false);
#include<algorithm>
#define inf 2000100000
typedef long long int ll;
using namespace std;
ll n,k,s,t;
struct p{
	ll c;
	ll v;
};
bool comp(p p1,p p2)
{
	return p1.v<p2.v;
}
p pa[200010];
ll gas[200010];
ll time(int idx)
{
	ll rval=0;
	if(gas[0]>pa[idx].v)return inf;else rval+=(2*(gas[0])-min((pa[idx].v-gas[0]),gas[0]));
	for(int i=0;i<k;i++){
		if(gas[i+1]-gas[i]>pa[idx].v)return inf;else rval+=(2*(gas[i+1]-gas[i])-min((pa[idx].v+gas[i]-gas[i+1]),gas[i+1]-gas[i]));
	}
	return rval;
}
int main()
{
    speed
	cin>>n>>k>>s>>t;
	for(int i=0;i<n;i++)cin>>pa[i].c>>pa[i].v;
	for(int i=0;i<k;i++)cin>>gas[i];gas[k]=s;
	sort(gas,gas+k+1);
//	cout<<time(1)<<endl<<endl;
	sort(pa,pa+n,comp);
//	for(int i=0;i<n;i++)cout<<pa[i].c<<"  "<<pa[i].v<<endl;
	int l=0-1,r=n,mid;
	while(l<r)
	{
	  //   cout<<l<<" "<<r<<" "<<t<<endl;
		mid=l+(r-l)/2;
	//	cout<<"**"<<time(mid)<<"  "<<mid<<endl;
		if(time(mid)<=t)r=mid;
		else l=mid+1;
	}
	ll ans=inf;
	//cout<<l<<" "<<r<<endl;
	//if(l==n-1)if(time(n-1)>t)l++;
	for(int i=l;i<n;i++)ans=min(ans,pa[i].c);
	if(ans==inf)cout<<"-1\n";else cout<<ans<<endl;
	return 0;
}


#include<iostream>
#include<string>
#include<algorithm>
#define inf 2000100000
typedef long long int ll;
using namespace std;
ll n,k,s,t;
struct p{
	ll c;
	ll v;
};
bool comp(p p1,p p2)
{
	return p1.v<p2.v;
}
p pa[200010];
ll gas[200010];
ll time(int idx)
{
	ll rval=0;
	if(gas[0]>pa[idx].v)return inf;else rval+=(2*(gas[0])-min((pa[idx].v-gas[0]),gas[0]));
	for(int i=0;i<k;i++){
		if(gas[i+1]-gas[i]>pa[idx].v)return inf;else rval+=(2*(gas[i+1]-gas[i])-min((pa[idx].v+gas[i]-gas[i+1]),gas[i+1]-gas[i]));
	}
	return rval;
}
int main()
{
    cin>>n>>k>>s>>t;
	for(int i=0;i<n;i++)cin>>pa[i].c>>pa[i].v;
	for(int i=0;i<k;i++)cin>>gas[i];gas[k]=s;
	sort(gas,gas+k+1);
//	cout<<time(1)<<endl<<endl;
	sort(pa,pa+n,comp);
//	for(int i=0;i<n;i++)cout<<pa[i].c<<"  "<<pa[i].v<<endl;
	int l=0,r=n-1,mid;
	while(l<r)
	{
	  //   cout<<l<<" "<<r<<" "<<t<<endl;
		mid=l+(r-l)/2;
	//	cout<<"**"<<time(mid)<<"  "<<mid<<endl;
		if(time(mid)<=t)r=mid;
		else l=mid+1;
	}
	ll ans=inf;
	//cout<<l<<" "<<r<<endl;
	if(l==n-1)if(time(n-1)>t)l++;
	for(int i=l;i<n;i++)ans=min(ans,pa[i].c);
	if(ans==inf)cout<<"-1\n";else cout<<ans<<endl;
	return 0;
}


#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

int main()
{
    cin >>n>>k>>s>>t;
    std::ios::sync_with_stdio(false);
    for(i=0;i<n;i++) cin>>c[i]>>v[i];
    for(i=0;i<k;i++) cin>>gas[i];
    sort(gas,gas+k);
    gas[k]=s;
    int l=1,r=1000000001;
    long long nowt,ts,ans;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    if(choose==1000000001) choose=-1;
    cout<<choose;
    return 0;
}


#include <iostream>

using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

void sortg(int l, int h)
{
    if(l>=h) return;
    int x=gas[l];
    int lp=l,rp=h;
    while(lp<rp)
    {
        while(lp<rp)
        {
            if(gas[rp]<x)
            {
                gas[lp]=gas[rp];
                lp++;
                break;
            }
            rp--;
        }
        while(lp<rp)
        {
            if(gas[lp]>x)
            {
                gas[rp]=gas[lp];
                rp--;
                break;
            }
            lp++;
        }
    }
    gas[lp]=x;
    sortg(l,lp-1);
    sortg(lp+1,h);
}

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) cin>>c[i]>>v[i];
    for(i=0;i<k;i++) cin>>gas[i];
    sortg(0,k-1);
    gas[k]=s;
    int l=1,r=1000000000;
    long long nowt,ts,ans;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    if(choose==1000000001) choose=-1;
    cout<<choose;
    return 0;
}


#include <iostream>

using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

void sortg(int l, int h)
{
    if(l>=h) return;
    int x=gas[l];
    int lp=l,rp=h;
    while(lp<rp)
    {
        while(lp<rp)
        {
            if(gas[rp]<x)
            {
                gas[lp]=gas[rp];
                lp++;
                break;
            }
            rp--;
        }
        while(lp<rp)
        {
            if(gas[lp]>x)
            {
                gas[rp]=gas[lp];
                rp--;
                break;
            }
            lp++;
        }
    }
    gas[lp]=x;
    sortg(l,lp-1);
    sortg(lp+1,h);
}

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) cin>>c[i]>>v[i];
    for(i=0;i<k;i++) cin>>gas[i];
    sortg(0,k-1);
    gas[k]=s;
    int l=1,r=1000000000,ans,ts;
    long long nowt;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    cout<<choose;
    return 0;
}


#include <iostream>

using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

void sortg(int l, int h)
{
    if(l>=h) return;
    int x=gas[l];
    int lp=l,rp=h;
    while(lp<rp)
    {
        while(lp<rp)
        {
            if(gas[rp]<x)
            {
                gas[lp]=gas[rp];
                lp++;
                break;
            }
            rp--;
        }
        while(lp<rp)
        {
            if(gas[lp]>x)
            {
                gas[rp]=gas[lp];
                rp--;
                break;
            }
            lp++;
        }
    }
    gas[lp]=x;
    sortg(l,lp-1);
    sortg(lp+1,h);
}

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) cin>>c[i]>>v[i];
    for(i=0;i<k;i++) cin>>gas[i];
    sortg(0,k-1);
    gas[k]=s;
    int l=1,r=1000000000;
    int ans,nowt,ts;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    cout<<choose;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) scanf("%d%d",&c[i],&v[i]);
    for(i=0;i<k;i++) scanf("%d",&gas[i]);
    sort(gas,gas+k);
    gas[k]=s;
    int l=1,r=1000000001;
    long long nowt,ts,ans;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    if(choose==1000000001) choose=-1;
    cout<<choose;
    return 0;
}


#include <iostream>

using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

void sortg(int l, int h)
{
    if(l>=h) return;
    int x=gas[l];
    int lp=l,rp=h;
    while(lp<rp)
    {
        while(lp<rp)
        {
            if(gas[rp]<x)
            {
                gas[lp]=gas[rp];
                lp++;
                break;
            }
            rp--;
        }
        while(lp<rp)
        {
            if(gas[lp]>x)
            {
                gas[rp]=gas[lp];
                rp--;
                break;
            }
            lp++;
        }
    }
    gas[lp]=x;
    sortg(l,lp-1);
    sortg(lp+1,h);
}

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) cin>>c[i]>>v[i];
    for(i=0;i<k;i++) cin>>gas[i];
    sortg(0,k-1);
    gas[k]=s;
    int l=1,r=1000000000;
    long long nowt,ts,ans;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    cout<<choose;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) scanf("%d%d",&c[i],&v[i]);
    for(i=0;i<k;i++) scanf("%d",&gas[i]);
    sort(gas,gas+k);
    gas[k]=s;
    int l=1,r=1000000000;
    long long nowt,ts,ans;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    if(choose==1000000001) choose=-1;
    cout<<choose;
    return 0;
}


#include <iostream>
#include <algorithm>
using namespace std;

int n,k,s,t;
int c[200000],v[200000],gas[200001];
int i,j;

int main()
{
    cin >>n>>k>>s>>t;
    for(i=0;i<n;i++) cin>>c[i]>>v[i];
    for(i=0;i<k;i++) cin>>gas[i];
    sort(gas,gas+k);
    gas[k]=s;
    int l=1,r=1000000000;
    long long nowt,ts,ans;
    while(l<r)
    {
        ans=(l+r)/2;
        nowt=0;
        for(i=0;i<=k;i++)
        {
            if(i==0) ts=gas[i];
            else ts=gas[i]-gas[i-1];
            if(ts>ans) { nowt=t+1;break;}
            if(ts*2<=ans) nowt+=ts;
            else nowt+=ts*2-(ans-ts);
        }
        if(nowt>t) l=ans+1;
        else r=ans;
    }
    ans=r;
    int choose=1000000001;
    for(i=0;i<n;i++)
    {
        if(v[i]>=ans)
        {
            if(c[i]<choose)
            {
                choose=c[i];
            }
        }
    }
    if(choose==1000000001) choose=-1;
    cout<<choose;
    return 0;
}


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;
        int l=1,r=s;
        while(l<r){
            if(l==r-1){
                if(gan(r)<=t) l=r;
                break;
            }
            int mid=(l+r)/2;
            if(gan(mid)<=t) r=mid;
            else l=mid+1;
        }
        //printf("l= %d\n",l);
        for(i=1;i<=n;i++){
            if(p[i].v>=l){
                printf("%d\n",p[i].c);
                f=true;
                break;
            }

        }
        if(!f) printf("-1\n");
    }
}


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;
        int l=1,r=s;
        while(l<r){
            if(l==r-1){
                if(gan(r)<=t) l=r;
                break;
            }
            int mid=(l+r)/2;
            if(gan(mid)<=t) r=mid;
            else l=mid+1;
        }
        ///printf("l= %d\n",l);
        for(i=1;i<=n;i++){
            if(p[i].c==84274778) printf("asdsad %d \n",p[i].v);
            if(p[i].v>=l){
                printf("%d\n",p[i].c);
                if(p[i].c==86075183) printf("%d %d\n",l,p[i].v);
                f=true;
                break;
            }

        }
        if(!f) printf("-1\n");
    }
}


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;
        int l=1,r=s;
        while(l<r){
            int mid=(l+r)/2;
            if(gan(mid)<=t) r=mid;
            else l=mid+1;
        }
        ///printf("l= %d\n",l);
        for(i=1;i<=n;i++){
            //if(p[i].c==84274778) printf("asdsad %d \n",p[i].v);
            if(p[i].v>=l){
                printf("%d\n",p[i].c);
                //if(p[i].c==86075183) printf("%d %d\n",l,p[i].v);
                f=true;
                break;
            }

        }
        if(!f) printf("-1\n");
    }
}


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;
        for(i=1;i<=n;i++){
            //printf("ads %lld\n",gan(p[i].v));
            if(gan(p[i].v)<=t){
                printf("%d\n",p[i].c);
                f=true;
                break;
            }

        }
        if(!f) printf("-1\n");
    }
}


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;
        int l=1,r=s;
        while(l<r){
            int mid=(l+r)/2;
            if(gan(mid)<=t) r=mid;
            else l=mid+1;
        }
        if(gan(l)>t){printf("-1\n");continue;}
        //printf("l= %d\n",l);
        for(i=1;i<=n;i++){
            //if(p[i].c==84274778) printf("asdsad %d \n",p[i].v);
            if(p[i].v>=l){
                printf("%d\n",p[i].c);
                //if(p[i].c==86075183) printf("%d %d\n",l,p[i].v);
                f=true;
                break;
            }

        }
        if(!f) printf("-1\n");
    }
}


/*
ID: CaoLei
PROG: c.cpp
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
int g[200010];
struct node{
    int c,v;
}p[200010];
bool cmp(node a,node b){return a.c<b.c;}
int k;
ll t;
ll gan(int v){
    int pre=0;
    ll ans=0;
    for(int i=1;i<=k;i++){
        if(v<g[i]-pre) return t+1;
        else{
            ans+=(ll)(g[i]-pre)*2;
            ans-=min((g[i]-pre),(v-(g[i]-pre)));
        }
        pre=g[i];
    }
    return ans;

}

int main(){
    int n,s;
    while(~scanf("%d%d%d%lld",&n,&k,&s,&t)){
        for(int i=1;i<=n;i++) scanf("%d%d",&p[i].c,&p[i].v);
        for(int i=1;i<=k;i++) scanf("%d",&g[i]);
        g[k+1]=s;
        k++;
        sort(g+1,g+1+k);
        sort(p+1,p+1+n,cmp);
        int i;
        bool f=false;
        int l=1,r=s;
        while(l<r){
            if(l==r-1){
                if(gan(r)<=t) l=r;
                break;
            }
            int mid=(l+r)/2;
            if(gan(mid)<=t) r=mid;
            else l=mid+1;
        }
        ///printf("l= %d\n",l);
        for(i=1;i<=n;i++){
            if(p[i].v>=l){
                printf("%d\n",p[i].c);
                if(p[i].c==86075183) printf("%d\n",l);
                f=true;
                break;
            }

        }
        if(!f) printf("-1\n");
    }
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

bool check(int mid)
{
    //printf("l:%d r:%d mid:%d\n", l, r, mid);
    int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
    //printf("pk: %d\n", pk);
    int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
    //printf("sumt: %d\n\n", sumt);
    if(sumt <= t) return true;
    else return false;
}

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(!check) l = mid+1;
        else r = mid-1;
    }
    if(l==dist[k] && !check(dist[k])) return -1;
    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    //cout<<mink<<" "<< dist[k] <<endl;
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || s>t) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || s>t) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r){
        int mid = (l+r)/2;
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;    //前pk段1km/min
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk)); //邮箱容量为mid时, 所花费的总时间
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    if(l==dist[k]){                                       //错误答案检查
        int pk = upper_bound(dist, dist+k+1, l/2)-dist;
        int sumt = sum[pk] + (3*(s-sum[pk]) - l*(k+1-pk));
        if(sumt>t) return -1;
    }
    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || mink==-1) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    if(l==dist[k]){
        int pk = upper_bound(dist, dist+k+1, l/2)-dist;
        int sumt = sum[pk] + (3*(s-sum[pk]) - l*(k+1-pk));
        if(sumt>t) return -1;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || s>t) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    if(l==dist[k]){
        int pk = upper_bound(dist, dist+k+1, l/2)-dist;
        int sumt = sum[pk] + (3*(s-sum[pk]) - l*(k+1-pk));

        if(sumt>t) return -1;
        cout<<sumt<<endl;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || s>t || mink==-1) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r){
        int mid = (l+r)/2;
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;    //前pk段1km/min
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk)); //邮箱容量为mid时, 所花费的总时间
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    int pk = upper_bound(dist, dist+k+1, l/2)-dist; //错误答案检查
    int sumt = sum[pk] + (3*(s-sum[pk]) - l*(k+1-pk));
    if(sumt>t) return -1;

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || mink==-1) puts("-1");
    else printf("%d\n", ans);
    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    if(l==dist[k]){
        int pk = upper_bound(dist, dist+k+1, l/2)-dist;
        int sumt = sum[pk] + (3*(s-sum[pk]) - l*(k+1-pk));

        if(sumt>t) return -1;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || s>t || mink==-1) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
pair<int, int> car[maxn];
int p[maxn], dist[maxn], sum[maxn];
int n, k, s, t;

int found(int l, int r)
{
    while(l<=r)
    {
        int mid = (l+r)/2;
        //printf("l:%d r:%d mid:%d\n", l, r, mid);
        int pk = upper_bound(dist, dist+k+1, mid/2)-dist;  //前pk段1km/min
        //printf("pk: %d\n", pk);
        int sumt = sum[pk] + (3*(s-sum[pk]) - mid*(k+1-pk));
        //printf("sumt: %d\n\n", sumt);
        if(sumt > t) l = mid+1;
        else r = mid-1;
    }

    return l;
}

int main()
{
    scanf("%d%d%d%d", &n, &k, &s, &t);

    for(int i=0; i<n; i++)
        scanf("%d%d", &car[i].first, &car[i].second);

    sum[0] = p[0] = 0;

    for(int i=1; i<=k; i++)
        scanf("%d", &p[i]);

    sort(p, p+k+1);

    for(int i=1; i<=k; i++)
        dist[i-1] = p[i]-p[i-1];

    dist[k] = s-p[k];

    sort(dist, dist+k+1);    //k+1段间距

    for(int i=1; i<=k+1; i++)
        sum[i] = sum[i-1] + dist[i-1];

    int mink = found(dist[k], 2*dist[k]+1);
    int ans = INT_MAX;

    for(int i=0; i<n; i++)
        if(car[i].second >= mink) ans = min(ans, car[i].first);

    if(ans==INT_MAX || s>=t) puts("-1");
    else printf("%d\n", ans);

    return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++)
		scanf("%d", &d[i]);
	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n-1, m, ans = INT_MAX;
	while (l <= r) {
		m = (l+r)/2;
		int cost = v[m].first, fuel = v[m].second, elapsed = 0, prev = 0, ok = 1, x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m-=1;
		}
		else l = m+1;
	}

	if (ans == INT_MAX) ans = -1;
	printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++) {
		scanf("%d", &d[i]);
	}

	sort(d, d+k);

	int l = 0, r = n, m, ans = INT_MAX;

	while (l < r) {
		m = (l+r)/2;
		int cost = v[m].first;
		int fuel = v[m].second;
		int elapsed = 0;
		int prev = 0;
		int ok = 1;

		for (int i = 0; i < k; i++) {
			int dist = d[i]-prev;
			int ll = 0, rr = fuel/2, mm, tme = INT_MAX;
			while (ll < rr) {
				mm = (ll+rr)/2;
				if (dist-mm <= fuel-2*mm) {
					tme = min(tme, mm+(dist-mm)*2);
					rr = mm;
				}
				else ll = mm+1;
			}
			if (tme == INT_MAX) {
				ok = 0;
				break;
			}
			elapsed += tme;
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else {
			l = m+1;
		}
	}

	if (ans == INT_MAX) printf("-1\n");
	else printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++)
		scanf("%d", &d[i]);
	sort(d, d+k);
	d[k] = s;

	int l = 0, r = 2000000000, m, ans = INT_MAX;
	while (l <= r) {
		m = (l+r)/2;
		int ok = 1, prev = 0, x = 0, tt = 0;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > m) {
				ok = 0;
				break;
			}
			else x = min(dist, m-dist);
			tt += (x+(dist-x)*2);
			prev = d[i];
		}

		if (tt > t) ok = 0;
		if (ok) r = m-1;
		else l = m+1;
	}

	for (int i = 0; i < n; i++) {
		if (v[i].second < l) continue;
		ans = min(ans, v[i].first);
	}

	if (ans == INT_MAX) ans = -1;
	printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
#define int long long
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pll v[200005];
int d[200005];
main() {
	int n, k, s, t, c, f;
	scanf("%lld %lld %lld %lld", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%lld %lld", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++) {
		scanf("%lld", &d[i]);
	}

	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n, m, ans = 100000000000000000;

	for (int j = 0; j < 50, j++) {
		m = (l+r)/2;
		int cost = v[m].first;
		int fuel = v[m].second;
		int elapsed = 0;
		int prev = 0;
		int ok = 1;
		int x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else {
			l = m+1;
		}
	}

	if (ans == 100000000000000000) printf("-1\n");
	else printf("%lld\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++) {
		scanf("%d", &d[i]);
	}

	sort(d, d+k);

	int l = 0, r = n, m, ans = INT_MAX;

	while (r-l > 1) {
		m = (l+r)/2;
		int cost = v[m].first;
		int fuel = v[m].second;
		int elapsed = 0;
		int prev = 0;
		int ok = 1;

		for (int i = 0; i < k; i++) {
			int dist = d[i]-prev;
			int ll = 0, rr = fuel/2, mm, tme = INT_MAX;
			while (rr-ll > 1) {
				mm = (ll+rr)/2;
				if (dist-mm <= fuel-2*mm) {
					tme = min(tme, mm+(dist-mm)*2);
					rr = mm-1;
				}
				else ll = mm;
			}
			if (tme == INT_MAX) {
				ok = 0;
				break;
			}
			elapsed += tme;
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else {
			l = m+1;
		}
	}

	if (ans == INT_MAX) printf("-1\n");
	else printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++)
		scanf("%d", &d[i]);
	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n, m, ans = INT_MAX;
	while (l < r) {
		m = (l+r)/2;
		int cost = v[m].first, fuel = v[m].second, elapsed = 0, prev = 0, ok = 1, x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) {
				ok = 0;
				break;
			}
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else l = m+1;
	}

	if (ans == INT_MAX) ans = -1;
	printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
#define int long long
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pll v[200005];
int d[200005];
main() {
	int n, k, s, t, c, f;
	scanf("%lld %lld %lld %lld", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%lld %lld", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++) {
		scanf("%lld", &d[i]);
	}

	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n, m, ans = 100000000000000000;

	for (int j = 0; j < 50; j++) {
		m = (l+r)/2;
		int cost = v[m].first;
		int fuel = v[m].second;
		int elapsed = 0;
		int prev = 0;
		int ok = 1;
		int x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else {
			l = m+1;
		}
	}

	if (ans == 100000000000000000) printf("-1\n");
	else printf("%lld\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++)
		scanf("%d", &d[i]);
	sort(d, d+k);
	d[k] = s;

	int l = 0, r = 1000500000, m, ans = INT_MAX;
	while (l <= r) {
		m = (l+r)/2;
		int ok = 1, prev = 0, x = 0, tt = 0;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > m) {
				ok = 0;
				break;
			}
			else x = min(dist, m-dist);
			tt += (x+(dist-x)*2);
			prev = d[i];
		}

		if (tt > t) ok = 0;
		if (ok) r = m-1;
		else l = m+1;
	}

	for (int i = 0; i < n; i++) {
		if (v[i].second < l) continue;
		ans = min(ans, v[i].first);
	}

	if (ans == INT_MAX) ans = -1;
	printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++) {
		scanf("%d", &d[i]);
	}

	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n, m, ans = INT_MAX;

	while (l < r) {
		m = (l+r)/2;
		int cost = v[m].first;
		int fuel = v[m].second;
		int elapsed = 0;
		int prev = 0;
		int ok = 1;
		int x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else {
			l = m+1;
		}
	}

	if (ans == INT_MAX) printf("-1\n");
	else printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++)
		scanf("%d", &d[i]);
	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n-1, m, ans = INT_MAX;
	while (l <= r) {
		m = (l+r)/2;
		int cost = v[m].first, fuel = v[m].second, elapsed = 0, prev = 0, ok = 1, x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m-1;
		}
		else l = m+1;
	}

	if (ans == INT_MAX) ans = -1;
	printf("%d\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
#define int long long
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pll v[200005];
int d[200005];
main() {
	int n, k, s, t, c, f;
	scanf("%lld %lld %lld %lld", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%lld %lld", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++) {
		scanf("%lld", &d[i]);
	}

	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n, m, ans = 100000000000000000;

	while (l < r) {
		m = (l+r)/2;
		int cost = v[m].first;
		int fuel = v[m].second;
		int elapsed = 0;
		int prev = 0;
		int ok = 1;
		int x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m;
		}
		else {
			l = m+1;
		}
	}

	if (ans == 100000000000000000) printf("-1\n");
	else printf("%lld\n", ans);
	return 0;
}


#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long long, long long> pll;

pii v[200005];
int d[200005];
int main() {
	int n, k, s, t, c, f;
	scanf("%d %d %d %d", &n, &k, &s, &t);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &c, &f);
		v[i] = mp(c, f);
	}

	sort(v, v+n);

	for (int i = 0; i < k; i++)
		scanf("%d", &d[i]);
	sort(d, d+k);
	d[k] = s;

	int l = 0, r = n-1, m, ans = INT_MAX;
	for (int j = 0; j < 70; j++) {
		m = (l+r)/2;
		int cost = v[m].first, fuel = v[m].second, elapsed = 0, prev = 0, ok = 1, x;
		for (int i = 0; i <= k; i++) {
			int dist = d[i]-prev;
			if (dist > fuel) ok = 0;
			else x = min(dist, fuel-dist);
			elapsed += (x+(dist-x)*2);
			prev = d[i];
		}

		if (elapsed > t) ok = 0;
		if (ok) {
			ans = min(ans, cost);
			r = m-1;
		}
		else l = m+1;
	}

	if (ans == INT_MAX) ans = -1;
	printf("%d\n", ans);
	return 0;
}


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef int ll;
typedef pair<int, int> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(int mid, int t, vi& arr){
    int limit = arr.size();
    int start = 0;
    int zaman = 0;
    lp(i,limit){
        int yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        int suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	//ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    int n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    ll l = 1, r = 1e9+100;
    while(l < r ){
        ll mid = (r+l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    if( !f(l,t,arr) ){
        cout << -1 << endl;
        return 0;
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( l <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef int ll;
typedef pair<int, int> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(int mid, int t, vi& arr){
    int limit = arr.size();
    int start = 0;
    int zaman = 0;
    lp(i,limit){
        int yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        int suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	//ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    int n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    int l = 1, r = 1e9+100;
    while(l + 1 < r ){
        int mid = l + (r-l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid;
        }
    }
    if( !f(l,t,arr) ){
        cout << -1 << endl;
        return 0;
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( l <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef long long int ll;
typedef pair<ll, ll> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<ll> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(ll mid, ll t, vi& arr){
    ll limit = arr.size();
    ll start = 0;
    ll zaman = 0;
    lp(i,limit){
        ll yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        ll suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	//ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    ll n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    ll l = 1, r = 1e9+100;
    while(l + 1 < r ){
        ll mid = (r+l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid;
        }
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( r <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef int ll;
typedef pair<int, int> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(int mid, int t, vi& arr){
    int limit = arr.size();
    int start = 0;
    int zaman = 0;
    lp(i,limit){
        int yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        int suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	//ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    int n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    int l = 1, r = 1e9+100;
    while(l + 1 < r){
        int mid = l + (r-l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    if( !f(l,t,arr) ){
        cout << -1 << endl;
        return 0;
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( l <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef int ll;
typedef pair<int, int> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(int mid, int t, vi& arr){
    int limit = arr.size();
    int start = 0;
    int zaman = 0;
    lp(i,limit){
        int yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        int suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	//ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    int n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    int l = 1, r = 1e9+100;
    while(l < r){
        int mid = l + (r-l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    if( !f(l,t,arr) ){
        cout << -1 << endl;
        return 0;
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( l <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef long long int ll;
typedef pair<ll, ll> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<ll> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(ll mid, ll t, vi& arr){
    ll limit = arr.size();
    ll start = 0;
    ll zaman = 0;
    lp(i,limit){
        ll yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        ll suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	//ios_base::sync_with_stdio(false);
    //cin.tie(NULL);
    ll n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    ll l = 1, r = 1e9+100;
    while(l < r ){
        ll mid = (r+l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    if( !f(l,t,arr) ){
        cout << -1 << endl;
        return 0;
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( l <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <bits/stdc++.h>
#define RLP(x,b,n) for( int x = b; x >= n; --x )
#define rlp(x,b) RLP(x,b,0)
#define LP(x,b,n) for( int x = b; x < n; ++x )
#define LPT(x,b,n) for( int x = b; x <= n; ++x )
#define lpt(x,n) LPT(x,0,n)
#define lp(x,n) LP(x,0,n)
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define ff first
#define ss second
#define N 2000000001
using namespace std;
typedef unsigned long long int ull;
typedef int ll;
typedef pair<ll, ll> ii;
typedef pair<int, ii > iii;
typedef pair<ii, ii > iiii;
typedef vector<ll> vi;
typedef vector<ii> vii;
typedef vector <iii> viii;
typedef vector <iiii> viiii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;

int dr[] = {0,   -1,  1,  0, -1,  1, -1, 1};
int dc[] = {-1,   0,  0,  1,  1, -1, -1, 1};

//void get_ints(vector<int>& v);

bool f(ll mid, ll t, vi& arr){
    ll limit = arr.size();
    ll start = 0;
    ll zaman = 0;
    lp(i,limit){
        ll yol = arr[i] - start;
        if( mid < yol ){
            return false;
        }
        ll suretli = min(mid-yol,yol);
        zaman += suretli*1 + ( yol - suretli ) * 2;
        start = arr[i];
    }
    if( zaman > t ){
        return false;
    }
    return true;
}
int main()
{
	//freopen ("C:\\Yarish\\texttest\\test.out","w",stdout);
    //freopen ("C:\\Yarish\\texttest\\test.in","r",stdin);
	ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll n, k, s, t;
    cin >> n >> k >> s >> t;
    vii cars(n);
    lp(i,n){
        cin >> cars[i].first >> cars[i].second;

    }
    vi arr(k+1);
    lp(i,k){
        cin >> arr[i];
    }
    arr[k] = s;
    sort(arr.begin(),arr.end());

    ll l = 1, r = 1e9+100;
    while(l < r ){
        ll mid = (r+l) / 2;
        if( f(mid,t,arr) ){
            r = mid;
        }
        else{
            l = mid + 1;
        }
    }
    if( !f(l,t,arr) ){
        cout << -1 << endl;
        return 0;
    }

    sort(cars.begin(),cars.end());
    lp(i,n){
        if( l <= cars[i].second ){
            cout << cars[i].first << endl;
            return 0;
        }
    }
    cout << -1 << endl;

    return 0;
}

/*

*/

/*
void get_ints(vector<int>& v)
{
	string s;
	int temp;
	getline(cin,s);
    stringstream ss(s);
	while(ss>>temp) v.push_back(temp);

}
*/


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 200; ++i)
	{
		long double mid = (l+r)/2.0;
		long double xh = mid*2.0;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2.0;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	for (int i = 0; i < 200; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=r) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<(int)ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 49; ++i)
	{
		long double mid = (l+r)/2.0;
		long double xh = mid*2.0;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2.0;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	for (int i = 0; i < 49; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=r) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<(int)ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<int,int > > vc;
int a[MAXN];
long double cal(long double v,long double x)
{
	if(v>=2*x) v = 2*x;
	double s2 = v-x,s1 = x-s2;
	return 2*s1+s2;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	ios::sync_with_stdio(false);
	int n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	if(k==200000) cout<<k<<endl;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>t)
			l = mid;
		else
			r = mid;
	}
	int ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=r) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<(int)ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 200; ++i)
	{
		long double mid = (l+r)/2;
		long double xh = mid*2;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	for (int i = 0; i < 200; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=r) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2.0;
		long double xh = mid*2.0;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2.0;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=r) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<(int)ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 70; ++i)
	{
		long double mid = (l+r)/2.0;
		long double xh = mid*2.0;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2.0;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	for (int i = 0; i < 70; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=r) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<(int)ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2;
		long double xh = mid*2;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 3e9+17;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>=t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=l) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<ans<<endl;
    return 0;
}


#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <map>
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 17;
const int MOD = 1e9 + 7;
vector<pair<long double,long double > > vc;
long double a[MAXN];
long double cal(long double v,long double x)
{
	long double l = 0,r = x;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2;
		long double xh = mid*2;
		if(x-mid>v-xh)
			r = mid;
		else
			l = mid;
	}
	long double ret = l + (x-l)*2;
	return ret;
}
int main(int argc, char const *argv[])
{
#ifdef noob
    freopen("Input.txt", "r", stdin);
    freopen("Output.txt", "w", stdout);
#endif
	long double n,k,s,t,mx = 0;
	cin>>n>>k>>s>>t;
	vc.resize(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>vc[i].first>>vc[i].second;
	}
	a[0] = 0;
	for (int i = 1; i <= k; ++i)
	{
		cin>>a[i];
	}
	a[(int)(1+k)] = s;
	sort(a,a+(int)(k+2));
	for (int i = 1; i <= k+1; ++i)
		mx = max(a[i]-a[i-1],mx);
	long double l = mx,r = 1e10+17;
	for (int i = 0; i < 100; ++i)
	{
		long double mid = (l+r)/2,sum = 0;
		for (int j = 1; j <= k+1; ++j)
		{
			sum += cal(mid,a[j]-a[j-1]);
		}
		if(sum>=t)
			l = mid;
		else
			r = mid;
	}
	long double ans = 3e9+7;
	for (int i = 0; i < n; ++i)
	{
		if((long double)vc[i].second>=l) ans = min(vc[i].first,ans);
	}
	if(ans==3e9+7) return cout<<-1<<endl,0;
	cout<<ans<<endl;
    return 0;
}