#include <bits/stdc++.h>
using namespace std;
vector<vector<long long> > treasure(300005);
vector<long long> safe;
long long dp[300005][4];
long long shortestDistance(long long col1, long long col2) {
  int ind = (int)(lower_bound(safe.begin(), safe.end(), col2) - safe.begin());
  if (ind >= safe.size()) {
    return abs(safe[safe.size() - 1] - col2) +
           abs(safe[safe.size() - 1] - col1);
  } else {
    long long temp1 = abs(safe[ind] - col2) + abs(safe[ind] - col1);
    long long temp2 = LONG_LONG_MAX;
    if (ind - 1 >= 0) {
      temp2 = abs(safe[ind - 1] - col2) + abs(safe[ind - 1] - col1);
    }
    return min(temp2, temp1);
  }
}
long long optimalTransitionDistance(long long i, long long j, long long col) {
  long long sr_fc, sr_lc;
  long long ans = LONG_LONG_MAX;
  long long ans1, ans2;
  sr_fc = treasure[j][0];
  sr_lc = treasure[j][treasure[j].size() - 1];
  ans1 = shortestDistance(col, sr_fc);
  ans2 = shortestDistance(col, sr_lc);
  ans = min(ans1 + dp[j][0], ans1 + dp[j][2]);
  ans = min(ans, ans2 + dp[j][1]);
  ans = min(ans, ans2 + dp[j][3]);
  return ans + abs(j - i);
}
int main() {
  ios_base::sync_with_stdio(false);
  long long n, m, k, q;
  cin >> n >> m >> k >> q;
  for (int i = 0; i < k; i++) {
    long long a, b;
    cin >> a >> b;
    treasure[a].push_back(b);
  }
  for (int i = 1; i <= n; i++) {
    if (treasure[i].size() != 0) sort(treasure[i].begin(), treasure[i].end());
  }
  for (int i = 0; i < q; i++) {
    long long a;
    cin >> a;
    safe.push_back(a);
  }
  sort(safe.begin(), safe.end());
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < 4; j++) {
      dp[i][j] = LONG_LONG_MAX;
    }
  }
  long long last = -1;
  for (int i = n; i >= 1; i--) {
    if (last == -1 && treasure[i].size() != 0) {
      for (int j = 0; j < 4; j++) {
        if (j < 2) {
          dp[i][j] = 2 * (treasure[i][treasure[i].size() - 1] - treasure[i][0]);
        } else {
          dp[i][j] = treasure[i][treasure[i].size() - 1] - treasure[i][0];
        }
      }
      last = i;
    } else if (i == 1) {
      for (int j = 0; j < 4; j++) {
        if (treasure[i].size() != 0) {
          if (j == 0) {
            long long col =
                j == 0 ? treasure[i][0] : treasure[i][treasure[i].size() - 1];
            dp[i][j] =
                2 * (treasure[i][treasure[i].size() - 1] - treasure[i][0]) +
                optimalTransitionDistance(i, last, col);
          } else if (j == 2) {
            long long col =
                j == 3 ? treasure[i][0] : treasure[i][treasure[i].size() - 1];
            dp[i][j] = (treasure[i][treasure[i].size() - 1] - treasure[i][0]) +
                       optimalTransitionDistance(i, last, col);
          }
          dp[i][j] += treasure[i][0] - 1;
        } else {
          dp[i][j] = optimalTransitionDistance(i, last, 1);
        }
      }
    } else if (treasure[i].size() != 0) {
      for (int j = 0; j < 4; j++) {
        if (j < 2) {
          long long col =
              j == 0 ? treasure[i][0] : treasure[i][treasure[i].size() - 1];
          dp[i][j] =
              2 * (treasure[i][treasure[i].size() - 1] - treasure[i][0]) +
              optimalTransitionDistance(i, last, col);
        } else {
          long long col =
              j == 3 ? treasure[i][0] : treasure[i][treasure[i].size() - 1];
          dp[i][j] = (treasure[i][treasure[i].size() - 1] - treasure[i][0]) +
                     optimalTransitionDistance(i, last, col);
        }
      }
      last = i;
    }
  }
  long long ans = LONG_LONG_MAX;
  for (int i = 0; i < 4; i++) {
    if (i == 2 || i == 0) ans = min(ans, dp[1][i]);
  }
  cout << ans << endl;
  return 0;
}
