#include <bits/stdc++.h>
using namespace std;
long long safeleft[2 * 100000 + 100];
long long saferight[2 * 100000 + 100];
vector<pair<long long, long long> > tr;
int n, m, k, q;
long long ans;
long long solve(int row, int init, int final) {
  long long ans1 = abs(init - tr[row].first) +
                   abs(tr[row].first - tr[row].second) +
                   abs(tr[row].second - final);
  long long ans2 = abs(init - tr[row].second) +
                   abs(tr[row].second - tr[row].first) +
                   abs(tr[row].first - final);
  return min(ans1, ans2);
}
long long solvefinal(int row, int init) {
  long long ans =
      abs(tr[row].first - init) + abs(tr[row].second - tr[row].first);
  ans = min(ans,
            abs(tr[row].second - init) + abs(tr[row].second - tr[row].first));
  return ans;
}
map<pair<int, int>, long long> mp;
long long find_ans(int i, int j) {
  if (mp.find({i, j}) != mp.end()) return mp[{i, j}];
  if (i == tr.size() - 1) {
    return solvefinal(i, j);
  }
  long long ans = LONG_LONG_MAX;
  if (safeleft[tr[i].first] != 0)
    ans = min(ans, solve(i, j, safeleft[tr[i].first]) +
                       find_ans(i + 1, safeleft[tr[i].first]));
  if (saferight[tr[i].first] != 0)
    ans = min(ans, solve(i, j, saferight[tr[i].first]) +
                       find_ans(i + 1, saferight[tr[i].first]));
  if (safeleft[tr[i].second] != 0)
    ans = min(ans, solve(i, j, safeleft[tr[i].second]) +
                       find_ans(i + 1, safeleft[tr[i].second]));
  if (saferight[tr[i].second] != 0)
    ans = min(ans, solve(i, j, saferight[tr[i].second]) +
                       find_ans(i + 1, saferight[tr[i].second]));
  mp[{i, j}] = ans;
  return ans;
}
void fill_safe_left_and_right(vector<int>& safe) {
  sort(safe.begin(), safe.end());
  int sz = safe.size();
  for (int i = 0; i + 1 < sz; i++) {
    int curr = safe[i];
    int next = safe[i + 1];
    for (int j = curr; j < next; j++) safeleft[j] = curr;
  }
  for (int i = safe[sz - 1]; i <= m; i++) {
    safeleft[i] = safe[sz - 1];
  }
  for (int i = sz - 1; i >= 1; i--) {
    int curr = safe[i];
    int prev = safe[i - 1];
    for (int j = curr; j > prev; j--) saferight[j] = curr;
  }
  for (int i = safe[0]; i >= 0; i--) {
    saferight[i] = safe[0];
  }
}
void fill_tr(vector<pair<int, int> >& tmp) {
  int sz = tmp.size();
  tr.reserve(n + 1);
  int i = 0;
  int l, r;
  while (i < sz) {
    int curr = tmp[i].first;
    l = tmp[i].second;
    while (i < sz && tmp[i].first == curr) i++;
    r = tmp[i - 1].second;
    tr.push_back({l, r});
  }
}
int main() {
  cin >> n >> m >> k >> q;
  vector<pair<int, int> > tmp(k + 1);
  for (int i = 0, r, c; i < k; i++) {
    cin >> tmp[i].first >> tmp[i].second;
  }
  tmp[k].first = tmp[k].second = 1;
  sort(tmp.begin(), tmp.end());
  fill_tr(tmp);
  ans += tmp.back().first - 1;
  vector<int> safe(q);
  for (int i = 0; i < q; i++) cin >> safe[i];
  fill_safe_left_and_right(safe);
  ans += find_ans(0, 1);
  cout << ans << endl;
  return 0;
}
