#include <bits/stdc++.h>
using namespace std;
template <class T>
constexpr T lcm(T m, T n) {
  return m / __gcd(m, n) * n;
}
template <typename I>
void join(ostream &ost, I s, I t, string d = " ") {
  for (auto i = s; i != t; ++i) {
    if (i != s) ost << d;
    ost << *i;
  }
  ost << endl;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &v) {
  for (auto &a : v) is >> a;
  return is;
}
template <typename T, typename U>
bool chmin(T &a, const U &b) {
  return (a > b ? a = b, true : false);
}
template <typename T, typename U>
bool chmax(T &a, const U &b) {
  return (a < b ? a = b, true : false);
}
template <typename T, size_t N, typename U>
void fill_array(T (&a)[N], const U &v) {
  fill((U *)a, (U *)(a + N), v);
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, m, k, q;
  while (cin >> n >> m >> k >> q) {
    vector<vector<int>> tr(n);
    for (long long int i = (0); i < (k); ++i) {
      int r, c;
      cin >> r >> c;
      --r, --c;
      tr[r].push_back(c);
    }
    for (long long int i = (0); i < (n); ++i) {
      sort((tr[i]).begin(), (tr[i]).end());
    }
    vector<int> b(q);
    cin >> b;
    for (auto &x : b) --x;
    sort((b).begin(), (b).end());
    while (tr.back().empty()) {
      tr.pop_back();
    }
    map<int, long long int> dp, temp;
    dp[0] = 0;
    for (long long int i = (0); i < (tr.size() - 1); ++i) {
      temp.clear();
      for (auto &[c, v] : dp) {
        if (tr[i].empty()) {
          if (i == 0) {
            temp[b.front()] = b.front() + 1;
          } else {
            temp[c] = v + 1;
          }
        } else {
          {
            long long int t =
                abs(c - tr[i].front()) + abs(tr[i].front() - tr[i].back());
            int j =
                lower_bound((b).begin(), (b).end(), tr[i].back()) - b.begin();
            if (b.back() < tr[i].back()) j = b.size() - 1;
            if (not((temp).find(b[j]) != (temp).end()))
              temp[b[j]] = v + t + abs(tr[i].back() - b[j]) + 1;
            else
              chmin(temp[b[j]], v + t + abs(tr[i].back() - b[j]) + 1);
            if (j > 0) {
              if (not((temp).find(b[j - 1]) != (temp).end()))
                temp[b[j - 1]] = v + t + abs(tr[i].back() - b[j - 1]) + 1;
              else
                chmin(temp[b[j - 1]], v + t + abs(tr[i].back() - b[j - 1]) + 1);
            }
          }
          {
            long long int t =
                abs(c - tr[i].back()) + abs(tr[i].back() - tr[i].front());
            int j =
                lower_bound((b).begin(), (b).end(), tr[i].front()) - b.begin();
            if (b.back() < tr[i].front()) j = b.size() - 1;
            if (not((temp).find(b[j]) != (temp).end()))
              temp[b[j]] = v + t + abs(tr[i].front() - b[j]) + 1;
            else
              chmin(temp[b[j]], v + t + abs(tr[i].front() - b[j]) + 1);
            if (j > 0) {
              if (not((temp).find(b[j - 1]) != (temp).end()))
                temp[b[j - 1]] = v + t + abs(tr[i].front() - b[j - 1]) + 1;
              else
                chmin(temp[b[j - 1]],
                      v + t + abs(tr[i].front() - b[j - 1]) + 1);
            }
          }
        }
      }
      swap(dp, temp);
    }
    long long int ans = LLONG_MAX;
    for (auto &[c, v] : dp) {
      long long int t = 0;
      if (tr.back().size())
        t = min(abs(c - tr.back().front()) +
                    abs(tr.back().front() - tr.back().back()),
                abs(c - tr.back().back()) +
                    abs(tr.back().back() - tr.back().front()));
      chmin(ans, v + t);
    }
    cout << ans << endl;
  }
  return 0;
}
