#include <bits/stdc++.h>
#pragma GCC omptimize("unroll-loops")
#pragma optimize("SEX_ON_THE_BEACH")
#pragma GCC optimize("no-stack-protector")
#pragma comment(linker, "/STACK:1000000000")
using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using dd = long double;
using ldd = long double;
using si = short int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
ll get_seed(string s) {
  ll ans = 0;
  for (int i = 0; i < s.size(); ++i) ans += s[i];
  return ans;
}
int popcount(int x) { return __builtin_popcount(x); }
ll popcountll(ll x) { return __builtin_popcount(x); }
void solve(int ii) {
  int n, m, k, q;
  cin >> n >> m >> k >> q;
  vector<vector<ll>> arr(n);
  for (int i = 0; i < k; ++i) {
    ll x, y;
    cin >> x >> y;
    --x;
    --y;
    arr[x].push_back(y);
  }
  vector<ll> sv(q);
  for (int i = 0; i < q; ++i) {
    cin >> sv[i];
    --sv[i];
  }
  sort((sv).begin(), (sv).end());
  sv.push_back(1e15);
  ll prev = 0;
  ll ans = 0;
  pair<ll, ll> dp = {0, 0};
  pair<ll, ll> curr = {0, 0};
  for (int i = 0; i < n; ++i) {
    if (arr[i].size() == 0) continue;
    sort((arr[i]).begin(), (arr[i]).end());
    0;
    ;
    0;
    ;
    0;
    ;
    0;
    ;
    0;
    ;
    pair<ll, ll> temp = {1e18, 1e18};
    0;
    ;
    ans += i - prev;
    prev = i;
    0;
    ;
    if (i == 0) {
      dp = {arr[0].back() + abs(arr[0].back() - arr[0][0]), arr[0].back()};
      curr = {arr[0][0], arr[0].back()};
      continue;
    }
    int ind = lower_bound((sv).begin(), (sv).end(), curr.first) - sv.begin();
    --ind;
    if (ind != -1) {
      ll x = sv[ind];
      temp.first =
          min(temp.first, abs(curr.first - x) + abs(arr[i].back() - x) +
                              abs(arr[i].back() - arr[i][0]) + dp.first);
    }
    if (ind != -1) {
      ll x = sv[ind];
      temp.second =
          min(temp.second, abs(curr.first - x) + abs(arr[i][0] - x) +
                               abs(arr[i].back() - arr[i][0]) + dp.first);
    }
    ++ind;
    if (ind != q) {
      ll x = sv[ind];
      temp.first =
          min(temp.first, abs(curr.first - x) + abs(arr[i].back() - x) +
                              abs(arr[i].back() - arr[i][0]) + dp.first);
    }
    if (ind != q) {
      ll x = sv[ind];
      temp.second =
          min(temp.second, abs(curr.first - x) + abs(arr[i][0] - x) +
                               abs(arr[i].back() - arr[i][0]) + dp.first);
    }
    ind = lower_bound((sv).begin(), (sv).end(), curr.second) - sv.begin();
    --ind;
    if (ind != -1) {
      ll x = sv[ind];
      temp.first =
          min(temp.first, abs(curr.second - x) + abs(arr[i].back() - x) +
                              abs(arr[i].back() - arr[i][0]) + dp.second);
    }
    if (ind != -1) {
      ll x = sv[ind];
      temp.second =
          min(temp.second, abs(curr.second - x) + abs(arr[i][0] - x) +
                               abs(arr[i].back() - arr[i][0]) + dp.second);
    }
    ++ind;
    if (ind != q) {
      ll x = sv[ind];
      temp.first =
          min(temp.first, abs(curr.second - x) + abs(arr[i].back() - x) +
                              abs(arr[i].back() - arr[i][0]) + dp.second);
    }
    if (ind != q) {
      ll x = sv[ind];
      temp.second =
          min(temp.second, abs(curr.second - x) + abs(arr[i][0] - x) +
                               abs(arr[i].back() - arr[i][0]) + dp.second);
    }
    dp = temp;
    curr = {arr[i][0], arr[i].back()};
  }
  cout << min(dp.first, dp.second) + ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  int t;
  t = 1;
  for (int i = 0; i < t; ++i) solve(i);
  return 0;
}
