#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = double;
using ull = unsigned long long;
void useiostream() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cout.setf(ios::fixed), cout.precision(20);
}
void drop(char const *bu) {
  printf("%s", bu);
  exit(0);
}
ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
ld const pi = acos(-1.0L);
ld const eps = 0.0001L;
template <typename T, typename TT>
bool mi(T &a, TT b) {
  return a > b ? (a = b, true) : false;
}
template <typename T, typename TT>
bool ma(T &a, TT b) {
  return a < b ? (a = b, true) : false;
}
mt19937 ran(time(0));
int const mod = 998244353;
int bp(int a, int p) {
  int re = 1;
  while (p) {
    if (p & 1) re = (re * 1LL * a) % mod;
    p >>= 1;
    a = (a * 1LL * a) % mod;
  }
  return re;
}
int inv(int a) { return bp(a, mod - 2); }
int n, m, k, q;
int safe[200005];
vector<int> xs[200005];
ll dp[200005][2];
int last[200005][2];
int main() {
  useiostream();
  cin >> n >> m >> k >> q;
  for (int i = 0; i < k; i++) {
    int x, y;
    cin >> y >> x;
    xs[y].push_back(x);
  }
  for (int i = 0; i < 200005; i++) {
    sort(xs[i].begin(), xs[i].end());
  }
  for (int i = 1; i <= q; i++) {
    cin >> safe[i];
  }
  safe[0] = INT_MIN;
  safe[q + 1] = INT_MAX;
  sort(safe, safe + q + 2);
  for (int i = 0; i <= n; i++) dp[i][0] = dp[i][1] = LLONG_MAX;
  if ((int)xs[1].size()) {
    dp[1][0] = xs[1].back() - 1 + abs(xs[1].back() - xs[1][0]);
    dp[1][1] = xs[1].back() - 1;
    last[1][0] = xs[1][0];
    last[1][1] = xs[1].back();
  } else {
    dp[1][0] = dp[1][1] = 0;
    last[1][0] = 1;
    last[1][1] = 1;
  }
  while ((int)xs[n].size() == 0) n--;
  function<ll(ll, ll, ll, ll)> calc = [&](ll prev, ll th, ll a, ll b) {
    return abs(prev - th) + abs(th - a) + abs(a - b);
  };
  for (int i = 2; i <= n; i++) {
    if ((int)xs[i].size() == 0) {
      last[i][0] = last[i - 1][0];
      last[i][1] = last[i - 1][1];
      dp[i][0] = dp[i - 1][0];
      dp[i][1] = dp[i - 1][1];
    } else {
      ll curLeft = xs[i][0];
      ll curRight = xs[i].back();
      ll prevLeft = last[i - 1][0];
      ll prevRight = last[i - 1][1];
      vector<int> ids;
      int idL = lower_bound(safe, safe + q + 2, prevLeft) - safe;
      int idR = lower_bound(safe, safe + q + 2, prevRight) - safe;
      idR--;
      idL--;
      ids.push_back(idR);
      ids.push_back(idR + 1);
      ids.push_back(idL);
      ids.push_back(idL + 1);
      ids.push_back(min(q + 1, idR + 2));
      ids.push_back(min(q + 1, idL + 2));
      idL = lower_bound(safe, safe + q + 2, curLeft) - safe;
      idR = lower_bound(safe, safe + q + 2, curRight) - safe;
      idL--;
      idR--;
      ids.push_back(idR);
      ids.push_back(idR + 1);
      ids.push_back(idL);
      ids.push_back(idL + 1);
      ids.push_back(min(q + 1, idR + 2));
      ids.push_back(min(q + 1, idL + 2));
      for (auto &id : ids) {
        mi(dp[i][0],
           min(calc(prevLeft, safe[id], curRight, curLeft) + dp[i - 1][0],
               calc(prevRight, safe[id], curRight, curLeft) + dp[i - 1][1]));
        mi(dp[i][1],
           min(calc(prevLeft, safe[id], curLeft, curRight) + dp[i - 1][0],
               calc(prevRight, safe[id], curLeft, curRight) + dp[i - 1][1]));
      }
      last[i][0] = curLeft;
      last[i][1] = curRight;
    }
  }
  cout << min(dp[n][0], dp[n][1]) + n - 1;
  return 0;
}
