#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-10;
const long long mod = 1e9 + 7;
const long long INF = (long long)1e14 + 7;
const int maxn = 2e5 + 5;
long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
void print(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) print(x / 10);
  putchar(x % 10 - '0');
}
vector<int> v, buf[maxn], idx, ext[maxn];
long long dp[maxn][5], h[maxn];
int n, m, k, q;
int main(void) {
  scanf("%d%d%d%d", &n, &m, &k, &q);
  int r, c;
  for (int i = 1; i <= k; i++) {
    scanf("%d%d", &r, &c);
    buf[r].push_back(c);
  }
  for (int i = 1; i <= n; i++) sort(buf[i].begin(), buf[i].end());
  idx.push_back(1);
  int last = 1;
  h[last] = 1;
  for (int i = 2; i <= n; i++) {
    if (buf[i].size() == 0) {
      h[last]++;
    } else {
      last = i;
      h[last] = 1;
      idx.push_back(i);
    }
  }
  int b;
  for (int i = 1; i <= q; i++) {
    scanf("%d", &b);
    v.push_back(b);
  }
  sort(v.begin(), v.end());
  for (int i = 0; i < idx.size() - 1; i++) {
    if (buf[idx[i]].size() == 0) {
      ext[idx[i]].push_back(v[0]);
    } else if (buf[idx[i]].size() == 1) {
      int p = lower_bound(v.begin(), v.end(), buf[idx[i]][0]) - v.begin();
      if (p != v.size()) ext[idx[i]].push_back(v[p]);
      if (p != 0) ext[idx[i]].push_back(v[p - 1]);
    } else {
      int p = lower_bound(v.begin(), v.end(), buf[idx[i]][0]) - v.begin();
      if (p != v.size()) ext[idx[i]].push_back(v[p]);
      if (p != 0) ext[idx[i]].push_back(v[p - 1]);
      p = lower_bound(v.begin(), v.end(), buf[idx[i]].back()) - v.begin();
      if (p != v.size()) ext[idx[i]].push_back(v[p]);
      if (p != 0) ext[idx[i]].push_back(v[p - 1]);
    }
  }
  if (buf[idx.back()].size() == 1)
    ext[idx.back()].push_back(buf[idx.back()][0]);
  else {
    ext[idx.back()].push_back(buf[idx.back()][0]);
    ext[idx.back()].push_back(buf[idx.back()].back());
  }
  for (int i = 1; i <= n; i++)
    for (int j = 0; j < 4; j++) dp[i][j] = INF;
  if (buf[1].size() == 0) {
    dp[1][0] = ext[1][0] - 1;
  } else
    for (int i = 0; i < ext[1].size(); i++) {
      dp[1][i] = buf[1].back() - 1 + abs(buf[1].back() - ext[1][i]);
    }
  for (int i = 1; i < idx.size(); i++) {
    for (int j = 0; j < ext[idx[i]].size(); j++) {
      for (int k = 0; k < ext[idx[i - 1]].size(); k++) {
        int po = ext[idx[i]][j], pi = ext[idx[i - 1]][k];
        long long tmp = dp[idx[i - 1]][k] + h[idx[i - 1]];
        if (pi <= po) {
          if (pi <= buf[idx[i]][0]) {
            tmp += buf[idx[i]].back() - pi;
          } else {
            tmp += pi - buf[idx[i]][0] + buf[idx[i]].back() - buf[idx[i]][0];
          }
          tmp += abs(buf[idx[i]].back() - po);
        } else {
          if (pi <= buf[idx[i]].back()) {
            tmp +=
                buf[idx[i]].back() - pi + buf[idx[i]].back() - buf[idx[i]][0];
          } else {
            tmp += pi - buf[idx[i]][0];
          }
          tmp += abs(buf[idx[i]][0] - po);
        }
        dp[idx[i]][j] = min(dp[idx[i]][j], tmp);
      }
    }
  }
  long long ans = INF;
  for (int i = 0; i < ext[idx.back()].size(); i++)
    ans = min(ans, dp[idx.back()][i]);
  printf("%lld\n", ans);
  return 0;
}
