#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const int iNF = 0x3f3f3f3f;
const long long MAXN = 200005;
int n, m, k, q;
vector<int> trea[MAXN];
vector<int> safe;
long long dp[MAXN][2];
pair<int, int> trav(int pos, int idx) {
  int hd = trea[idx].front(), tl = trea[idx].back();
  return pair<long long, long long>(abs(tl - pos) + abs(tl - hd),
                                    abs(hd - pos) + abs(tl - hd));
}
void upd(long long val, int pos, int idx) {
  val++;
  auto ptr = lower_bound(safe.begin(), safe.end(), pos);
  int tL = (ptr == safe.end() ? (*prev(ptr)) : *ptr);
  int tR = (ptr == safe.begin() ? (*ptr) : (*prev(ptr)));
  pair<int, int> travL = trav(tL, idx);
  pair<int, int> travR = trav(tR, idx);
  travL.first += abs(tL - pos);
  travL.second += abs(tL - pos);
  travR.first += abs(tR - pos);
  travR.second += abs(tR - pos);
  dp[idx][0] = min({dp[idx][0], travL.first + val, travR.first + val});
  dp[idx][1] = min({dp[idx][1], travL.second + val, travR.second + val});
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k >> q;
  int mxN = 1;
  for (int i = 0; i < k; i += 1) {
    int r, c;
    cin >> r >> c;
    mxN = max(mxN, r);
    trea[r].emplace_back(c);
  }
  n = mxN;
  for (int i = 0; i < q; i += 1) {
    int c;
    cin >> c;
    safe.emplace_back(c);
  }
  for (int i = 1; i < n + 1; i += 1) {
    sort(trea[i].begin(), trea[i].end());
  }
  sort(safe.begin(), safe.end());
  memset(dp, (INF), sizeof(dp));
  int hd, ta;
  if (trea[1].empty()) {
    dp[1][0] = 0, dp[1][1] = 0;
    hd = 1, ta = 1;
  } else {
    pair<int, int> flay = trav(1, 1);
    dp[1][0] = flay.first, dp[1][1] = flay.second;
    hd = trea[1].front(), ta = trea[1].back();
  };
  for (int i = 1; i < n + 1; i += 1) {
    ;
  }
  for (int i = 1; i < n; i++) {
    if (trea[i + 1].empty()) {
      dp[i + 1][0] = dp[i][0] + 1;
      dp[i + 1][1] = dp[i][1] + 1;
    } else {
      upd(dp[i][0], hd, i + 1);
      upd(dp[i][1], ta, i + 1);
      hd = trea[i + 1].front(), ta = trea[i + 1].back();
    }
  }
  for (int i = 1; i < n + 1; i += 1) {
    ;
  }
  cout << min(dp[n][0], dp[n][1]) << '\n';
  return 0;
}
