#include <bits/stdc++.h>
using namespace std;
template <typename G1, typename G2 = G1, typename G3 = G1>
struct triple {
  G1 first;
  G2 second;
  G3 T;
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  vector<vector<int>> v(n);
  for (int i = 0; i < k; i++) {
    int x, y;
    cin >> x >> y;
    --x;
    --y;
    v[x].push_back(y);
  }
  vector<int> c(q);
  for (auto &i : c) cin >> i, --i;
  sort(c.begin(), c.end());
  v[0].push_back(0);
  int plus = 0;
  for (int i = 0; i < n; i++) sort(v[i].begin(), v[i].end());
  vector<vector<int>> w(2);
  for (int i = 0; i < n; i++)
    if (!v[i].empty()) {
      w[0].push_back(v[i][0]);
      w[1].push_back(v[i].back());
      plus = max(plus, i);
    }
  n = w[0].size();
  vector<long long> cur(2);
  cur[0] = 2 * w[1][0];
  cur[1] = w[1][0];
  for (int i = 1; i < n; i++) {
    vector<pair<long long, long long>> temp;
    for (int j = 0; j < 2; j++) {
      int t = w[j][i - 1];
      auto it = upper_bound(c.begin(), c.end(), t);
      if (it != c.end()) temp.push_back({*it, cur[j] + *it - t});
      if (it != c.begin()) --it, temp.push_back({*it, cur[j] + t - *it});
    }
    cur[0] = cur[1] = 1e18;
    int l = w[0][i], r = w[1][i];
    for (auto j : temp) {
      if (j.first <= r)
        cur[0] = min(cur[0], j.second + r - j.first + r - l);
      else
        cur[0] = min(cur[0], j.second + j.first - l);
      if (j.first >= l)
        cur[1] = min(cur[1], j.second + j.first - l + r - l);
      else
        cur[1] = min(cur[1], j.second + r - j.first);
    }
  }
  cout << min(cur[0], cur[1]) + plus << '\n';
  return 0;
}
