#include <bits/stdc++.h>
using namespace std;
int n, m, k, q;
long long dp[200010][2] = {0}, mn[200010], mx[200010], L, R;
vector<long long> vec[200010];
vector<long long> vecr;
vector<long long> b[2];
int cal(long long r, long long c, int B) {
  L = *lower_bound(b[1].begin(), b[1].end(), -c);
  R = *lower_bound(b[0].begin(), b[0].end(), c);
  L = -L;
  if (B) {
    if (mn[r] > c) {
      if (R <= mn[r])
        return mx[r] - c;
      else
        return min(abs(c - L), abs(R - mn[r])) * 2 + mx[r] - c;
    } else if (mx[r] < c) {
      if (L >= mn[r])
        return c - mn[r] + mx[r] - mn[r];
      else
        return min(abs(R - c), abs(mn[r] - L)) * 2 + c - mn[r] + mx[r] - mn[r];
    } else {
      if (L >= mn[r])
        return c - mn[r] + mx[r] - mn[r];
      else
        return min(abs(mn[r] - L), abs(R - c)) * 2 + c - mn[r] + mx[r] - mn[r];
    }
  } else {
    if (mx[r] < c) {
      if (L >= mx[r])
        return c - mn[r];
      else
        return min(abs(R - c), abs(mx[r] - L)) * 2 + c - mn[r];
    } else if (mn[r] > c) {
      if (R <= mx[r])
        return mx[r] - c + mx[r] - mn[r];
      else
        return min(abs(c - L), abs(R - mx[r])) * 2 + mx[r] - c + mx[r] - mn[r];
    } else {
      if (R <= mx[r])
        return mx[r] - c + mx[r] - mn[r];
      else
        return min(abs(R - mx[r]), abs(c - L)) * 2 + mx[r] - c + mx[r] - mn[r];
    }
  }
}
int main() {
  cin >> n >> m >> k >> q;
  for (int i = 1; i <= k; i++) {
    long long r, c;
    scanf("%lld%lld", &r, &c);
    vec[r].push_back(c);
    vecr.push_back(r);
  }
  vecr.push_back(1);
  sort(vecr.begin(), vecr.end());
  vector<long long>::iterator it = unique(vecr.begin(), vecr.end());
  vecr.erase(it, vecr.end());
  for (int i = 1; i <= q; i++) {
    int t;
    scanf("%d", &t);
    b[0].push_back(t);
    b[1].push_back(-t);
  }
  b[0].push_back(-1e9);
  b[0].push_back(1e9);
  b[1].push_back(-1e9);
  b[1].push_back(1e9);
  sort(b[0].begin(), b[0].end());
  sort(b[1].begin(), b[1].end());
  for (int i = 1; i <= n; i++) {
    mx[i] = 0;
    mn[i] = m;
    for (int j = 0; j < vec[i].size(); j++) {
      mx[i] = max(mx[i], vec[i][j]);
      mn[i] = min(mn[i], vec[i][j]);
    }
  }
  mn[0] = mx[0] = 1;
  mn[1] = min(1LL, mn[1]);
  mx[1] = max(1LL, mx[1]);
  dp[0][0] = dp[0][1] = mx[1] - mn[1];
  dp[0][0] *= 2;
  for (int rr = 1; rr < vecr.size(); rr++) {
    int now = vecr[rr], pre = vecr[rr - 1];
    long long tmp;
    dp[rr][0] = min(cal(now, mn[pre], 0) + dp[rr - 1][0],
                    cal(now, mx[pre], 0) + dp[rr - 1][1]) +
                now - pre;
    dp[rr][1] = min(cal(now, mn[pre], 1) + dp[rr - 1][0],
                    cal(now, mx[pre], 1) + dp[rr - 1][1]) +
                now - pre;
  }
  int mxr = vecr.size() - 1;
  printf("%lld\n", min(dp[mxr][0], dp[mxr][1]));
}
