#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const long long INF = 1e16;
const int MX = 100101;
const long double PI =
    3.14159265358979323846264338327950288419716939937510582097494L;
template <typename T>
pair<T, T> operator+(const pair<T, T> &a, const pair<T, T> &b) {
  return pair<T, T>(a.first + b.first, a.second + b.second);
}
template <typename T>
pair<T, T> operator-(const pair<T, T> &a, const pair<T, T> &b) {
  return pair<T, T>(a.first - b.first, a.second - b.second);
}
template <typename T>
T operator*(const pair<T, T> &a, const pair<T, T> &b) {
  return (a.first * b.first + a.second * b.second);
}
template <typename T>
T operator^(const pair<T, T> &a, const pair<T, T> &b) {
  return (a.first * b.second - a.second * b.first);
}
template <typename T>
void print(vector<T> vec, string name = "") {
  cout << name;
  for (auto u : vec) cout << u << ' ';
  cout << '\n';
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int N, M, K, Q;
  cin >> N >> M >> K >> Q;
  vector<vector<int> > rows_(N + 1);
  vector<int> safe(Q);
  int r, c;
  int naujasn = 1;
  for (int i = 0; i < K; ++i) {
    cin >> r >> c;
    rows_[r].push_back(c);
    naujasn = max(naujasn, r);
  }
  for (int i = 0; i <= N; ++i) sort(rows_[i].begin(), rows_[i].end());
  for (int i = 0; i < Q; ++i) cin >> safe[i];
  sort(safe.begin(), safe.end());
  vector<vector<int> > rows(N + 1, vector<int>(2));
  for (int i = 0; i <= N; ++i) {
    if (rows_[i].empty()) {
      rows[i][0] = -1;
      rows[i][1] = -1;
    } else {
      rows[i][0] = rows_[i][0];
      rows[i][1] = rows_[i][rows_[i].size() - 1];
    }
  }
  vector<vector<long long> > dp(N + 1, vector<long long>(2, INF));
  rows[1][0] = 1;
  if (rows[1][1] == -1) rows[1][1] = 1;
  dp[1][0] = 2 * (rows[1][1] - rows[1][0]) + rows[1][0] - 1;
  dp[1][1] = rows[1][1] - 1;
  N = naujasn;
  int last = 1;
  for (int i = 2; i <= N; ++i) {
    if (rows[i][0] == -1) {
      continue;
    }
    for (int j : {0, 1}) {
      auto desIt = upper_bound(safe.begin(), safe.end(), rows[i][j]);
      if (desIt != safe.end()) {
        long long kur = *desIt;
        for (int k : {0, 1}) {
          dp[i][1 - j] =
              min(abs(kur - rows[last][k]) + abs(kur - rows[i][j]) +
                      dp[last][k] + (i - last) + rows[i][1] - rows[i][0],
                  dp[i][1 - j]);
        }
      }
      if (desIt != safe.begin()) {
        desIt--;
        long long kur = *desIt;
        for (int k : {0, 1}) {
          dp[i][1 - j] =
              min(abs(kur - rows[last][k]) + abs(kur - rows[i][j]) +
                      dp[last][k] + (i - last) + rows[i][1] - rows[i][0],
                  dp[i][1 - j]);
        }
      }
    }
    last = i;
  }
  printf("%lld\n", min(dp[N][0], dp[N][1]));
}
