#include <bits/stdc++.h>
void dout() { std::cout << std::endl; }
template <typename Head, typename... Tail>
void dout(Head H, Tail... T) {}
struct Car {
  int cost, w;
};
int main() {
  int n, k, s, t;
  scanf("%d %d %d %d", &n, &k, &s, &t);
  std::vector<Car> cars;
  for (int i = 0; i < n; i++) {
    int c, w;
    scanf("%d %d", &c, &w);
    cars.push_back(Car{c, w});
  }
  std::sort(cars.begin(), cars.end(), [](const Car &left, const Car &right) {
    return std::tie(left.cost, left.w) < std::tie(right.cost, right.w);
  });
  std::vector<int> petrols(1 + k, 0);
  for (int i = 1; i <= k; i++) {
    scanf("%d", &petrols[i]);
  }
  petrols.push_back(s);
  std::sort(petrols.begin(), petrols.end());
  int left = 0;
  int right = (int)1e9 + 1;
  while (left + 1 < right) {
    int w = (left + right) / 2;
    int curTime = 0;
    dout("=======================");
    dout("cur volume", w);
    for (int i = 1; i < (int)petrols.size(); i++) {
      int sCur = petrols[i] - petrols[i - 1];
      if (sCur > w) {
        curTime = t + 1;
        break;
      }
      if (sCur * 2 <= w) {
        curTime += sCur;
        continue;
      }
      curTime += sCur * 2 - (w - sCur);
    }
    if (curTime > t) {
      left = w;
    } else {
      right = w;
    }
  }
  int minW = right;
  dout("minV", minW);
  int ans = -1;
  for (Car car : cars) {
    if (car.w >= minW) {
      ans = car.cost;
      break;
    }
  }
  printf("%d", ans);
  return 0;
}
