#include <bits/stdc++.h>
using namespace std;
template <typename Tp>
inline void outarr(Tp _begin, Tp _end, const char* _delim = " ") {
  for (Tp current = _begin; current != _end; ++current) {
    std::cout << *current << _delim;
  }
  std::cout << '\n';
}
using ll = long long;
using pii = std::pair<int, int>;
constexpr int INF = 0x3f3f3f3f;
constexpr int MOD = static_cast<const int>(1e9 + 7);
int col[200000];
pii gr[200000];
int cur[2];
ll dp[2];
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  for (int i = 0; i < (n); ++i) {
    gr[i].first = INF;
    gr[i].second = -INF;
  }
  int fx = INF;
  int lx = -INF;
  for (int i = 0; i < (k); ++i) {
    int x, y;
    cin >> x >> y;
    --x;
    --y;
    gr[x].first = min(gr[x].first, y);
    gr[x].second = max(gr[x].second, y);
    fx = min(x, fx);
    lx = max(x, lx);
  }
  for (int i = 0; i < (q); ++i) {
    cin >> col[i];
    --col[i];
  }
  sort(col, col + q);
  ll d = 0;
  if (gr[0].first != INF) {
    cur[0] = cur[1] = gr[0].second;
    d = gr[0].second;
  }
  for (int i = 1; i < n; ++i) {
    if (gr[i].first == INF) {
      continue;
    }
    d += gr[i].second - gr[i].first;
    ll val0 = LLONG_MAX;
    ll val1 = LLONG_MAX;
    for (int t = 0; t < 2; ++t) {
      int j = distance(col, lower_bound(col, col + q, cur[t]));
      int l = j < q ? col[j] : col[q - 1];
      int r = j > 0 ? col[j - 1] : col[0];
      val1 = min(val1, dp[t] + min(abs(cur[t] - l) + abs(gr[i].first - l),
                                   abs(cur[t] - r) + abs(gr[i].first - r)));
      val0 = min(val0, dp[t] + min(abs(cur[t] - l) + abs(gr[i].second - l),
                                   abs(cur[t] - r) + abs(gr[i].second - r)));
    }
    dp[0] = val0;
    dp[1] = val1;
    cur[0] = gr[i].first;
    cur[1] = gr[i].second;
  }
  ll ans = min(dp[0], dp[1]) + d + lx;
  cout << ans << "\n";
  return 0;
}
