#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int n, m, q, r, c, k, pr[N], last, arr[N];
vector<int> v[N];
vector<int> pre[N];
vector<long long> dp[N], dp2[N];
int nxt[N];
multiset<long long> st;
multiset<long long>::iterator it;
int main() {
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int i = 0; i < k; i++) {
    scanf("%d%d", &r, &c);
    v[r].push_back(c);
  }
  for (int i = 0; i < q; i++) {
    scanf("%d", &arr[i]);
  }
  arr[q] = 1000000010;
  sort(arr, arr + q);
  int j = 0;
  for (int i = 1; i <= m; i++) {
    while (j < q && arr[j] < i) j++;
    nxt[i] = j;
  }
  v[1].push_back(1);
  for (int i = 1; i <= n; i++) {
    sort(v[i].begin(), v[i].end());
    v[i].resize(unique(v[i].begin(), v[i].end()) - v[i].begin());
  }
  pre[1].push_back(1);
  last = 1;
  for (int i = 2; i <= n; i++) {
    if ((int)v[i].size() == 0) continue;
    for (j = 0; j < (int)v[last].size(); j++) {
      if (nxt[v[last][j]] != q) pre[i].push_back(arr[nxt[v[last][j]]]);
      if (nxt[v[last][j]] != 0) pre[i].push_back(arr[nxt[v[last][j]] - 1]);
    }
    sort(pre[i].begin(), pre[i].end());
    pre[i].resize(unique(pre[i].begin(), pre[i].end()) - pre[i].begin());
    last = i;
  }
  long long ans = last - 1;
  int tmp1, tmp2;
  long long tmp3, tmp4;
  for (int i = last; i > 0; i--) {
    if ((int)v[i].size() == 0) continue;
    dp2[i].resize((int)v[i].size(), 0);
    dp[i].resize((int)pre[i].size(), 0);
    tmp2 = 0;
    st.clear();
    for (j = 0; j < (int)v[i].size() && i != last; j++) {
      tmp1 = arr[nxt[v[i][j]]];
      while (tmp2 < (int)pre[last].size() && pre[last][tmp2] < tmp1) tmp2++;
      dp2[i][j] = (long long)1e18;
      if (tmp2 >= 0 && tmp2 < (int)pre[last].size())
        dp2[i][j] =
            min(dp2[i][j], dp[last][tmp2] + abs(pre[last][tmp2] - v[i][j]));
      tmp2--;
      if (tmp2 >= 0 && tmp2 < (int)pre[last].size())
        dp2[i][j] =
            min(dp2[i][j], dp[last][tmp2] + abs(pre[last][tmp2] - v[i][j]));
      tmp2++;
    }
    for (j = 0; j < (int)v[i].size(); j++) {
      st.insert(dp2[i][j] + abs(v[i].back() - v[i][j]) * 2 + v[i][j]);
    }
    tmp2 = 0;
    tmp3 = (long long)1e18;
    for (j = 0; j < (int)pre[i].size(); j++) {
      dp[i][j] = (long long)1e18;
      while (tmp2 < (int)v[i].size() && v[i][tmp2] <= pre[i][j]) {
        it = st.lower_bound(dp2[i][tmp2] + abs(v[i].back() - v[i][tmp2]) * 2 +
                            v[i][tmp2]);
        assert(*it ==
               dp2[i][tmp2] + abs(v[i].back() - v[i][tmp2]) * 2 + v[i][tmp2]);
        st.erase(it);
        tmp3 = min(tmp3,
                   dp2[i][tmp2] + (abs(v[i][tmp2] - v[i][0]) * 2 - v[i][tmp2]));
        tmp2++;
      }
      dp[i][j] =
          min(dp[i][j], tmp3 + pre[i][j] + max(0, v[i].back() - pre[i][j]) * 2);
      if ((int)st.size() != 0)
        dp[i][j] = min(dp[i][j], max(0, pre[i][j] - v[i][0]) * 2 - pre[i][j] +
                                     *st.begin());
    }
    last = i;
  }
  ans += dp[1][0];
  cout << ans << endl;
  return 0;
}
