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

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

#include <bits/stdc++.h>
using namespace std;
typedef __int64 LL;
const LL maxn = 2*(1e5)+10;
struct node{
    int ci;
    int vi;
}car[maxn], NewCar[maxn];
int gas[maxn];
int n, k, s, t;
int len=0;
bool cmp(node x, node y){
    if(x.vi == y.vi) return x.ci<y.ci;
    return x.vi>y.vi;
}
bool cmp_0(int x, int y){
    return x<y;
}
void removal(){
    for(int i=0; i<=k; i++){
        int flag = 1;
        for(int j=i+1; j<=k; j++){
            if(car[j].vi < car[i].vi){
                NewCar[len].ci = car[i].ci;
                NewCar[len++].vi = car[i].vi;
                break;
            }
            if(flag){
                flag = 0;
                NewCar[len].ci = car[i].ci;
                NewCar[len++].vi = car[i].vi;
            }
            i++;
        }
    }
}
int judge(int x){
    int re = 0;
    int temp, y;
    for(int i=1; i<=k; i++){
        temp = gas[i] - gas[i-1];
        y = temp*2 - NewCar[x].vi;     //��ͨ�ٶ�
        if(y < 0) y = 0;
        else if(y > temp) return -1;
        re += temp+y;
    }
    temp = s - gas[k];
    y = temp*2 - NewCar[x].vi;
    if(y < 0) y = 0;
    else if(y > temp) return -1;
    re += temp+y;
    return re;
}
int main(){
    gas[0] = 0;
    scanf("%d%d%d%d", &n, &k, &s, &t);
    for(int i=0; i<n; i++) scanf("%d%d", &car[i].ci, &car[i].vi);
    for(int i=1; i<=k; i++) scanf("%d", &gas[i]);
    gas[++k] = s;
    sort(car, car+n, cmp);
    removal();
    sort(gas, gas+k+1, cmp_0);

    int temp = judge(0);
    if(temp==-1 && temp>t){
        printf("-1");
        return 0;
    }
    int re = 0;
    for(int i=1; i<n; i++){
        temp = judge(i);
        if(temp>t || temp==-1){
            printf("%d", NewCar[i-1].ci);
            return 0;
        }
        re = i;
    }
    printf("%d", NewCar[re].ci);

    return 0;
}
/*
-1          -> -1
>           -> -1
< < <  (-1) -> <
< < >  (-1) -> <

3 1 8 10
10 8
5 7
11 9
3
----------
10

2 2 10 18
10 4
20 6
5 3
----------
20
*/
