#include <bits/stdc++.h>
using namespace std;
int n, m, k, q, Left[200006], Right[200006], Leftmost[200006],
    Rightmost[200006];
long long a[200006][5];
long long last[5], cur[5];
long long dist(long long a, long long b) { return abs(a - b); }
long long calc_last(long long x) {
  long long ans1 = dist(x, Right[n]);
  ans1 += dist(Right[n], Left[n]);
  long long ans2 = dist(x, Left[n]);
  ans2 += dist(Left[n], Right[n]);
  long long ans = min(ans1, ans2) + 1;
  return ans;
}
long long calc(long long i, long long x, long long y) {
  long long ans1 = dist(x, Right[i]);
  ans1 += dist(Right[i], Left[i]);
  ans1 += dist(Left[i], y);
  long long ans2 = dist(x, Left[i]);
  ans2 += dist(Left[i], Right[i]);
  ans2 += dist(Right[i], y);
  long long ans = min(ans1, ans2) + 1;
  return ans;
}
void preset(vector<int> &safe) {
  for (int i = 1; i <= safe[0]; ++i) Rightmost[i] = safe[0];
  for (int i = safe[0]; i < safe[1]; ++i) Leftmost[i] = safe[0];
  for (int i = 1; i < int(safe.size()) - 1; ++i) {
    for (int j = safe[i - 1] + 1; j <= safe[i]; ++j) Rightmost[j] = safe[i];
    for (int j = safe[i]; j < safe[i + 1]; ++j) Leftmost[j] = safe[i];
  }
  for (int j = safe[int(safe.size()) - 2] + 1; j <= safe[int(safe.size()) - 1];
       ++j)
    Rightmost[j] = safe[int(safe.size()) - 1];
  for (int j = safe[int(safe.size()) - 1]; j <= m; ++j)
    Leftmost[j] = safe[int(safe.size()) - 1];
}
int main() {
  scanf("%d %d %d %d", &n, &m, &k, &q);
  for (int i = 1; i <= k; ++i) {
    int x, y;
    scanf("%d %d", &x, &y);
    if (Left[x] == 0)
      Left[x] = y;
    else
      Left[x] = min(Left[x], y);
    Right[x] = max(Right[x], y);
  }
  vector<int> safe(q);
  for (int &x : safe) scanf("%d", &x);
  sort((safe).begin(), (safe).end());
  preset(safe);
  while (Right[n] == 0) --n;
  if (n == 1) return !printf("%d\n", Right[1] - 1);
  if (Right[1] == 0)
    a[1][0] = Rightmost[1] - 1, last[0] = Rightmost[1];
  else {
    if (Leftmost[Right[1]] != 0) {
      a[1][0] = Right[1] - 1 + dist(Right[1], Leftmost[Right[1]]);
      last[0] = Leftmost[Right[1]];
    }
    if (Rightmost[Right[1]] != 0) {
      a[1][1] = Right[1] - 1 + dist(Right[1], Rightmost[Right[1]]);
      last[1] = Rightmost[Right[1]];
    }
  }
  for (int i = 2; i < n; ++i) {
    for (int j = 0; j < 4; ++j) a[i][j] = 1000000000000001;
    if (Right[i] == 0) {
      for (int j = 0; j < 4; ++j) a[i][j] = a[i - 1][j] + 1;
      continue;
    }
    cur[0] = Leftmost[Left[i]];
    cur[1] = Rightmost[Left[i]];
    cur[2] = Leftmost[Right[i]];
    cur[3] = Rightmost[Right[i]];
    for (int j = 0; j < 4; ++j) {
      if (last[j] != 0) {
        for (int t = 0; t < 4; ++t) {
          if (cur[t] != 0) {
            a[i][t] = min(a[i][t], a[i - 1][j] + calc(i, last[j], cur[t]));
          }
        }
      }
    }
    for (int j = 0; j < 4; ++j) last[j] = cur[j];
  }
  long long ans = 1000000000000001;
  for (int j = 0; j < 4; ++j) {
    if (last[j] != 0) ans = min(ans, a[n - 1][j] + calc_last(last[j]));
  }
  printf("%lld\n", ans);
  return 0;
}
