#include <bits/stdc++.h>
using namespace std;
map<pair<long long int, long long int>, long long int> cache;
vector<long long int> b;
map<long long int, set<long long int>> g;
long long int n, m, k, q, top_row;
long long int right(long long int col) {
  auto it = lower_bound(b.begin(), b.end(), col) - b.begin();
  if (it == q) {
    return -1;
  }
  return b[it];
}
long long int left(long long int col) {
  auto it = lower_bound(b.begin(), b.end(), col) - b.begin();
  it--;
  if (it == -1) {
    return -1;
  }
  return b[it];
}
long long int up(long long int row) {
  auto it = *g.upper_bound(row);
  return it.first;
}
long long int go(long long int row, long long int col) {
  if (cache.find({row, col}) != cache.end()) {
    return cache[{row, col}];
  }
  long long int ans = 1e12;
  long long int l = *g[row].begin();
  long long int r = *g[row].rbegin();
  if (row == top_row) {
    return abs(r - l) + min(abs(l - col), abs(r - col));
  } else if (col >= l && col <= r) {
    if (right(r) >= 0) {
      ans = min(ans, abs(r - l) + abs(l - col) + abs(right(r) - r) +
                         go(up(row), right(r)));
    }
    if (left(r) >= 0) {
      ans = min(ans, abs(r - l) + abs(l - col) + abs(left(r) - r) +
                         go(up(row), left(r)));
    }
    if (right(l) >= 0) {
      ans = min(ans, abs(l - r) + abs(r - col) + abs(right(l) - l) +
                         go(up(row), right(l)));
    }
    if (left(l) >= 0) {
      ans = min(ans, abs(l - r) + abs(r - col) + abs(left(l) - l) +
                         go(up(row), left(l)));
    }
  } else if (col <= l) {
    if (right(r) >= 0) {
      ans = min(ans, abs(r - l) + abs(l - col) + abs(right(r) - r) +
                         go(up(row), right(r)));
    }
    if (left(r) >= 0) {
      ans = min(ans, abs(r - l) + abs(l - col) + abs(left(r) - r) +
                         go(up(row), left(r)));
    }
  } else {
    if (right(l) >= 0) {
      ans = min(ans, abs(l - r) + abs(r - col) + abs(right(l) - l) +
                         go(up(row), right(l)));
    }
    if (left(l) >= 0) {
      ans = min(ans, abs(l - r) + abs(r - col) + abs(left(l) - l) +
                         go(up(row), left(l)));
    }
  }
  return cache[{row, col}] = ans;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m >> k >> q;
  for (long long int i = 1; i <= k; i++) {
    long long int r, c;
    cin >> r >> c;
    g[r].insert(c);
    top_row = max(top_row, r);
  }
  b.resize(q);
  for (long long int i = 0; i < q; i++) {
    cin >> b[i];
  }
  sort(b.begin(), b.end());
  if (g[1].empty()) {
    g[1].insert(1);
    top_row = max(top_row, 1ll);
  }
  cout << go(1, 1) + top_row - 1 << "\n";
}
