#include <bits/stdc++.h>
using namespace std;
int n, m, k, q, l[200010], r[200010];
vector<int> safe;
vector<vector<int>> vec, tran;
vector<vector<pair<int, long long>>> dp;
int main() {
  while (scanf("%d%d%d%d", &n, &m, &k, &q) != EOF) {
    vec.clear();
    vec.resize(n + 1);
    tran.clear();
    tran.resize(n + 1);
    memset(l, 0x3f, sizeof l);
    memset(r, -0x3f, sizeof r);
    for (int i = 1, r, c; i <= k; ++i) {
      scanf("%d%d", &r, &c);
      vec[r].push_back(c);
    }
    safe.clear();
    for (int i = 1, x; i <= q; ++i) {
      scanf("%d", &x);
      safe.push_back(x);
    }
    int Max = 0;
    for (int i = 1; i <= n; ++i) {
      if (!vec[i].empty()) {
        Max = i;
        sort(vec[i].begin(), vec[i].end());
        l[i] = vec[i][0];
        r[i] = vec[i].back();
      }
    }
    sort(safe.begin(), safe.end());
    for (int i = 1; i < Max; ++i) {
      if (vec[i].empty()) {
        if (i == 1) {
          int pos = lower_bound(safe.begin(), safe.end(), 1) - safe.begin();
          if (pos < (int)safe.size()) {
            tran[1].push_back(safe[pos]);
          }
          if (pos > 0) {
            tran[1].push_back(safe[pos - 1]);
          }
        } else {
          tran[i] = tran[i - 1];
        }
      } else {
        int pos = lower_bound(safe.begin(), safe.end(), l[i]) - safe.begin();
        if (pos < (int)safe.size()) {
          tran[i].push_back(safe[pos]);
        }
        if (pos > 0) {
          tran[i].push_back(safe[pos - 1]);
        }
        pos = lower_bound(safe.begin(), safe.end(), r[i]) - safe.begin();
        if (pos < (int)safe.size()) {
          tran[i].push_back(safe[pos]);
        }
        if (pos > 0) {
          tran[i].push_back(safe[pos - 1]);
        }
        sort(tran[i].begin(), tran[i].end());
        tran[i].erase(unique(tran[i].begin(), tran[i].end()), tran[i].end());
      }
    }
    tran[Max] = vec[Max];
    vec.clear();
    dp.clear();
    dp.resize(n + 1);
    dp[0].push_back(pair<int, long long>(1, -1));
    long long res = -1;
    for (int i = 1; i <= Max; ++i) {
      if (l[i] == -1 && r[i] == -1) {
        for (auto it : dp[i - 1])
          dp[i].push_back(pair<int, long long>(it.first, it.second + 1));
        ++res;
      } else {
        for (auto it : tran[i]) {
          long long Min = 0x3f3f3f3f3f3f3f3f;
          long long tmp = 0;
          for (auto it2 : dp[i - 1]) {
            tmp = it2.second + 1;
            int x = it2.first, y = it;
            if (x <= y) {
              tmp += y - x;
              if (x > l[i]) tmp += 2ll * (x - l[i]);
              if (y < r[i]) tmp += 2ll * (r[i] - y);
            } else {
              tmp += x - y;
              if (x < r[i]) tmp += 2ll * (r[i] - x);
              if (y > l[i]) tmp += 2ll * (y - l[i]);
            }
            Min = min(Min, tmp);
          }
          dp[i].push_back(pair<int, long long>(it, Min));
        }
        res = 0x3f3f3f3f3f3f3f3f;
        for (auto it : dp[i]) res = min(res, it.second);
      }
    }
    printf("%lld\n", res);
  }
  return 0;
}
