#include <bits/stdc++.h>
using namespace std;
vector<long long> col;
vector<pair<long long, long long>> tr;
vector<vector<long long>> c;
vector<vector<long long>> dp(2);
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  for (int i = 0; i <= n; i++) tr.push_back({-1, -1});
  c.resize(n + 1);
  for (int i = 0; i < k; i++) {
    long long second, first;
    cin >> second >> first;
    if (tr[second].first == -1)
      tr[second] = {first, first};
    else
      tr[second].first = min(tr[second].first, first),
      tr[second].second = max(tr[second].second, first);
  }
  for (int i = 0; i < q; i++) {
    long long b;
    cin >> b;
    col.push_back(b);
  }
  sort(col.begin(), col.end());
  c[0].push_back(1);
  int mx = -1;
  for (int i = 1; i <= n; i++) {
    if (tr[i].first == -1) {
      if (i != 1)
        c[i] = c[i - 1];
      else
        c[i].push_back(col[0]);
    } else {
      mx = i;
      set<long long> st;
      auto it = lower_bound(col.begin(), col.end(), tr[i].first);
      if (it != col.end()) st.insert(*it);
      if (it != col.begin()) st.insert(*prev(it));
      it = lower_bound(col.begin(), col.end(), tr[i].second);
      if (it != col.end()) st.insert(*it);
      if (it != col.begin()) st.insert(*prev(it));
      for (auto j = st.begin(); j != st.end(); j++) c[i].push_back(*j);
    }
  }
  c[mx] = {tr[mx].first, tr[mx].second};
  vector<long long> emp = {(long long)(1e18), (long long)(1e18),
                           (long long)(1e18), (long long)(1e18)};
  dp[0] = dp[1] = emp;
  dp[0][0] = -1;
  for (int i = 1; i <= mx; i++) {
    for (int j = 0; j < c[i].size(); j++) {
      for (int k = 0; k < c[i - 1].size(); k++) {
        long long add = 0;
        if (tr[i].first == -1)
          add = llabs(c[i][j] - c[i - 1][k]) + 1;
        else if (tr[i].first >= c[i - 1][k])
          add = tr[i].second - c[i - 1][k] + 1 + llabs(c[i][j] - tr[i].second);
        else if (tr[i].second <= c[i - 1][k])
          add = c[i - 1][k] - tr[i].first + 1 + llabs(c[i][j] - tr[i].first);
        else
          add = min(tr[i].second - c[i - 1][k] + 1 + tr[i].second -
                        tr[i].first + llabs(c[i][j] - tr[i].first),
                    c[i - 1][k] - tr[i].first + 1 + tr[i].second - tr[i].first +
                        llabs(c[i][j] - tr[i].second));
        dp[1][j] = min(dp[1][j], dp[0][k] + add);
      }
    }
    dp[0] = dp[1];
    dp[1] = emp;
  }
  long long ans = 1e18;
  for (int i = 0; i < c[mx].size(); i++) ans = min(ans, dp[0][i]);
  cout << ans << '\n';
  return 0;
}
