#include <bits/stdc++.h>
using namespace std;
const int MX = 2e5 + 5;
const long long INF = 4e18;
map<long long, vector<long long> > mp;
vector<long long> b;
long long a[MX][4];
long long dp[MX][4];
long long mx[MX];
long long mn[MX];
long long n, k, q, m;
long long solve(int x, int y, int z) {
  if (x == n) return 0;
  long long &res = dp[x][y];
  if (res != -1) return res;
  res = INF;
  int l = mn[x];
  int r = mx[x];
  if (a[x][0] != -1) {
    long long dis = abs(z - r) + abs(r - l) + abs(l - a[x][0]) * (x < n - 1);
    res = min(res, dis + solve(x + 1, 0, a[x][0]));
  }
  if (a[x][1] != -1) {
    long long dis = abs(z - r) + abs(r - l) + abs(l - a[x][1]) * (x < n - 1);
    res = min(res, dis + solve(x + 1, 1, a[x][1]));
  }
  if (a[x][2] != -1) {
    long long dis = abs(z - l) + abs(r - l) + abs(r - a[x][2]) * (x < n - 1);
    res = min(res, dis + solve(x + 1, 2, a[x][2]));
  }
  if (a[x][3] != -1) {
    long long dis = abs(z - l) + abs(r - l) + abs(r - a[x][3]) * (x < n - 1);
    res = min(res, dis + solve(x + 1, 3, a[x][3]));
  }
  return res;
}
int main() {
  cin >> n >> m >> k >> q;
  m = 0;
  for (int i = 0; i < k; ++i) {
    long long x, y;
    cin >> x >> y;
    m = max(m, x);
    mp[x].push_back(y);
  }
  mp[1].push_back(1);
  for (int i = 0; i < q; ++i) {
    int x;
    cin >> x;
    b.push_back(x);
  }
  sort(b.begin(), b.end());
  n = 0;
  for (auto row : mp) {
    mx[n] = *max_element(row.second.begin(), row.second.end());
    mn[n] = *min_element(row.second.begin(), row.second.end());
    n++;
  }
  memset(a, -1, sizeof(a));
  for (int i = 0; i < n; ++i) {
    long long num1, num2;
    long long x = mn[i];
    long long y = mx[i];
    long long idx = upper_bound(b.begin(), b.end(), x) - b.begin();
    if (idx < q) a[i][0] = b[idx];
    if (idx > 0) a[i][1] = b[idx - 1];
    idx = upper_bound(b.begin(), b.end(), y) - b.begin();
    if (idx < q) a[i][2] = b[idx];
    if (idx > 0) a[i][3] = b[idx - 1];
  }
  memset(dp, -1, sizeof(dp));
  cout << solve(0, 0, 1) + m - 1 << "\n";
}
