#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
using namespace std;
const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const double PI = acos(-1);
template <class T, class S>
inline void add(T &a, S b) {
  a += b;
  if (a >= mod) a -= mod;
}
template <class T, class S>
inline void sub(T &a, S b) {
  a -= b;
  if (a < 0) a += mod;
}
template <class T, class S>
inline bool chkmax(T &a, S b) {
  return a < b ? a = b, true : false;
}
template <class T, class S>
inline bool chkmin(T &a, S b) {
  return a > b ? a = b, true : false;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n, m, k, q;
int mx[N], mn[N];
int cnt;
int tot[N];
map<int, long long> Map[N];
vector<int> V;
int calc(int p, int p1, int p2) { return abs(p - p1) + abs(p1 - p2); }
int main() {
  memset(mx, 0xc0, sizeof(mx));
  memset(mn, 0x3f, sizeof(mn));
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int i = 1; i <= k; i++) {
    int r, c;
    scanf("%d%d", &r, &c);
    chkmax(mx[r], c);
    chkmin(mn[r], c);
    tot[r]++;
    cnt++;
  }
  if (!cnt) {
    puts("0");
    return 0;
  }
  while (!tot[n]) n--;
  V.push_back(0);
  V.push_back(m + 1);
  for (int i = 1; i <= q; i++) {
    int b;
    scanf("%d", &b);
    V.push_back(b);
  }
  sort((V).begin(), (V).end());
  if (tot[1]) {
    Map[1][mx[1]] = mx[1] - 1;
  } else {
    Map[1][1] = 0;
  }
  for (int i = 1; i < n; i++) {
    assert(((int)Map[i].size()) <= 2);
    int d = 1;
    int cur = i;
    while (!tot[i + 1]) {
      i++;
      d++;
    }
    for (auto &t : Map[cur]) {
      int p = t.first;
      long long val = t.second;
      int pos = lower_bound((V).begin(), (V).end(), p) - V.begin();
      if (V[pos] != m + 1) {
        long long dis = abs(V[pos] - p) + d;
        long long nVal = calc(V[pos], mn[i + 1], mx[i + 1]);
        if (!Map[i + 1].count(mx[i + 1])) {
          Map[i + 1][mx[i + 1]] = val + dis + nVal;
        } else {
          chkmin(Map[i + 1][mx[i + 1]], val + dis + nVal);
        }
        nVal = calc(V[pos], mx[i + 1], mn[i + 1]);
        if (!Map[i + 1].count(mn[i + 1])) {
          Map[i + 1][mn[i + 1]] = val + dis + nVal;
        } else {
          chkmin(Map[i + 1][mn[i + 1]], val + dis + nVal);
        }
      }
      pos--;
      if (V[pos] != 0) {
        long long dis = abs(V[pos] - p) + d;
        long long nVal = calc(V[pos], mn[i + 1], mx[i + 1]);
        if (!Map[i + 1].count(mx[i + 1])) {
          Map[i + 1][mx[i + 1]] = val + dis + nVal;
        } else {
          chkmin(Map[i + 1][mx[i + 1]], val + dis + nVal);
        }
        nVal = calc(V[pos], mx[i + 1], mn[i + 1]);
        if (!Map[i + 1].count(mn[i + 1])) {
          Map[i + 1][mn[i + 1]] = val + dis + nVal;
        } else {
          chkmin(Map[i + 1][mn[i + 1]], val + dis + nVal);
        }
      }
    }
    Map[cur].clear();
  }
  long long ans = INF;
  for (auto &t : Map[n]) {
    chkmin(ans, t.second);
  }
  printf("%lld\n", ans);
  return 0;
}
