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>
const long long N = 200010;
long long n, k, s, tot, l, r, mid, pos[N], Time;
struct lr {
  long long v, c;
  bool operator<(const lr &a) const { return c < a.c; }
} a[N], b[N];
bool check(long long x) {
  long long t = 0, s, del;
  for (long long i = 1; i <= k; ++i) {
    if (t > Time) return 0;
    s = pos[i] - pos[i - 1];
    if (b[x].v < s) return 0;
    del = b[x].v - s;
    if (del >= s) {
      t += s;
    } else {
      t += s * 2 - del;
    }
  }
  if (t <= Time) return 1;
  return 0;
}
int main() {
  scanf("%I64d%I64d%I64d%I64d", &n, &k, &s, &Time);
  for (long long i = 1; i <= n; ++i) scanf("%I64d%I64d", &a[i].c, &a[i].v);
  for (long long i = 1; i <= k; ++i) scanf("%I64d", pos + i);
  pos[++k] = s;
  std::sort(pos + 1, pos + 1 + k);
  std::sort(a + 1, a + 1 + n);
  for (long long i = 1; i <= n; ++i)
    if (a[i].v <= a[i - 1].v)
      continue;
    else
      b[++tot] = a[i];
  l = 1;
  r = tot;
  while (l != r) {
    mid = l + r >> 1;
    if (check(mid))
      r = mid;
    else
      l = mid + 1;
  }
  if (l >= tot && !check(l)) return puts("-1"), 0;
  printf("%I64d\n", b[l].c);
  return 0;
}
