#include <bits/stdc++.h>
using namespace std;
const int INF = (int)(1e9 + 1e6 + 123);
const long long LINF = (long long)(1e18 + 1e9 + 123);
template <typename A, typename B>
bool mini(A& x, const B& y) {
  if (y < x) {
    x = y;
    return true;
  }
  return false;
}
template <typename A, typename B>
bool maxi(A& x, const B& y) {
  if (y > x) {
    x = y;
    return true;
  }
  return false;
}
bool test(int mask, int bit) { return mask & (1 << bit); }
void run();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cout << fixed << setprecision(12);
  run();
  return 0;
}
const int N = (int)(2e5 + 123);
int n, m, k, q;
long long pos[N][2];
long long dp[N][2];
vector<long long> s;
vector<long long> get(long long x) {
  auto it = lower_bound(s.begin(), s.end(), x);
  vector<long long> res;
  if (it != s.end()) {
    res.push_back(*it);
  }
  if (it != s.begin()) {
    --it;
    res.push_back(*it);
  }
  return res;
}
void run() {
  for (int i = 0; i < N; i++) {
    pos[i][0] = LINF;
    pos[i][1] = -LINF;
    dp[i][0] = LINF;
    dp[i][1] = LINF;
  }
  cin >> n >> m >> k >> q;
  vector<long long> lines = {1};
  pos[1][0] = pos[1][1] = 1;
  for (int i = 0; i < k; i++) {
    long long r, c;
    cin >> r >> c;
    maxi(pos[r][1], c);
    mini(pos[r][0], c);
    lines.push_back(r);
  }
  sort((lines).begin(), (lines).end());
  lines.resize(unique((lines).begin(), (lines).end()) - lines.begin());
  s.resize(q);
  for (int i = 0; i < q; i++) {
    cin >> s[i];
  }
  sort((s).begin(), (s).end());
  s.resize(unique((s).begin(), (s).end()) - s.begin());
  dp[1][0] = (pos[1][1] - 1) * 2;
  dp[1][1] = pos[1][1] - 1;
  for (int i = 0; i < ((int)lines.size()) - 1; i++) {
    long long cur = lines[i];
    long long nxt = lines[i + 1];
    for (int d1 = 0; d1 < 2; d1++) {
      for (int d2 = 0; d2 < 2; d2++) {
        long long cur_x = pos[cur][d1];
        long long nxt_x = pos[nxt][!d2];
        for (long long safe : get(cur_x)) {
          mini(dp[nxt][d2], dp[cur][d1] + abs(cur_x - safe) +
                                abs(safe - nxt_x) + pos[nxt][1] - pos[nxt][0]);
        }
      }
    }
  }
  cout << min(dp[lines.back()][0], dp[lines.back()][1]) + lines.back() - 1
       << "\n";
}
