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

import java.io.*;
import java.util.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {

        File file = new File("in.txt");
        InputStream inputStream = null;
        // try {inputStream= new FileInputStream(file);} catch (FileNotFoundException ex){return;};
        inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        TaskB solver = new TaskB();
        solver.solve(1, in, out);
        out.close();
    }
}





class TaskB {
    Integer roadLength;
    Integer time;
    List<Integer> gasStations;
    public void solve(int testNumber, InputReader in, PrintWriter out) {
        Integer numberOfCars = in.nextInt();
        Integer numberOfGasStations = in.nextInt();
        roadLength = in.nextInt();
        time = in.nextInt();
        List<Integer> price = new ArrayList<>(numberOfCars);
        List<Integer> tankCapacity = new ArrayList<>(numberOfCars);
        gasStations = new ArrayList<>(numberOfGasStations+1);
        gasStations.add(0);
        for(int i=0; i<numberOfCars; i++){
            price.add(in.nextInt());
            tankCapacity.add(in.nextInt());
        }
        for(int i=0; i<numberOfGasStations; i++){
            gasStations.add(in.nextInt());
        }
        gasStations.add(roadLength);
        gasStations.sort(Integer::compareTo);


        List<Integer> tankCopy = new ArrayList<>(tankCapacity);
        tankCopy.sort(Integer::compareTo);

        Integer min = 0;
        Integer max = tankCopy.size()-1;
        Integer mid = null;

        if(!willReach(tankCopy.get(max))){
            out.println("-1");
            return;
        }
        while(min<max){
            mid = (min+max) / 2;
            if(willReach(tankCopy.get(mid))){
                max = mid;
            }
            else{
                min = mid+1;
            }
        }

        Integer capacityAtLeast = tankCopy.get(min);





        Integer minPrice = Integer.MAX_VALUE;
        for(int i=0; i<numberOfCars; i++){
            if(tankCapacity.get(i) >= capacityAtLeast){
                minPrice = Math.min(minPrice, price.get(i));
            }
        }
        if(minPrice == Integer.MAX_VALUE){
            out.println("-1");
        }
        else {
            out.println(minPrice);
        }


    }

    public boolean willReach(Integer tankCapacity){
        Integer timePassed = 0;
        for(int i=0; i<gasStations.size()-1; i++){
            Integer dist = gasStations.get(i+1) - gasStations.get(i);
            if(dist>tankCapacity){
                return Boolean.FALSE;
            }
            Integer timeOnFasterSpeed = Math.min(dist, (tankCapacity-dist));
            timePassed += timeOnFasterSpeed + Math.max((dist - timeOnFasterSpeed)*2,0);
        }
        if(timePassed > time){
            return Boolean.FALSE;
        }
        return Boolean.TRUE;


    }





}




class InputReader {
    public BufferedReader reader;
    public StringTokenizer tokenizer;

    public InputReader(InputStream stream) {
        reader = new BufferedReader(new InputStreamReader(stream), 32768);
        tokenizer = null;
    }

    public String next() {
        while (tokenizer == null || !tokenizer.hasMoreTokens()) {
            try {
                tokenizer = new StringTokenizer(reader.readLine());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return tokenizer.nextToken();
    }

    public String nextLine(){
        try {
            return reader.readLine();
        } catch (IOException e){
            throw new RuntimeException(e);
        }
    }

    public int nextInt() {
        return Integer.parseInt(next());
    }
    public long nextLong() { return Long.parseLong(next()); }

}



class Pair<F, S> {
    public final F first;
    public final S second;




    public Pair(F first, S second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Pair)) {
            return false;
        }
        Pair<?, ?> p = (Pair<?, ?>) o;
        return Objects.equals(p.first, first) && Objects.equals(p.second, second);
    }

    @Override
    public int hashCode() {
        return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
    }

    @Override
    public String toString() {
        return "(" + first + ", " + second + ')';
    }
}