#include <bits/stdc++.h>

#include <atcoder/all>
using namespace std;
using i32 = int;
using u32 = unsigned int;
using i64 = long long;
using u64 = unsigned long long;
#define FAST_IO                \
  ios::sync_with_stdio(false); \
  cin.tie(0);
const i64 INF = 1001001001001001001;
using Modint = atcoder::static_modint<998244353>;

vector<i64> dijkstra(int s, vector<vector<pair<int, int>>> G) {
  vector<i64> dist(G.size(), INF);
  dist[s] = 0;
  priority_queue<pair<i64, int>, vector<pair<i64, int>>, greater<pair<i64, int>>> pq;
  pq.push({0, s});

  while (pq.size() > 0) {
    auto [d, u] = pq.top();
    pq.pop();

    if (dist[u] < d) continue;

    for (auto [v, c] : G[u]) {
      if (dist[v] > dist[u] + c) {
        dist[v] = dist[u] + c;
        pq.push({dist[v], v});
      }
    }
  }

  return dist;
}


int main() {
  FAST_IO
  auto ans = 0LL;

  int N, KA, KB;
  cin >> N >> KA >> KB;

  vector<int> a(KA), b(KB);
  for (auto& x : a) cin >> x;
  for (auto& x : b) cin >> x;


  vector<vector<pair<int, int>>> G(N + 2);
  for (int i = 0; i < N - 1; i ++) {
    G[i].push_back({i + 1, 1});
    G[i + 1].push_back({i, 1});
  }

  for (auto x : a) {
    x --;
    G[N].push_back({x, 0});
    G[x].push_back({N, 0});
  }
  for (auto x : b) {
    x --;
    G[N + 1].push_back({x, 0});
    G[x].push_back({N + 1, 0});
  }

  auto dist1 = dijkstra(N, G);
  auto dist2 = dijkstra(N + 1, G);

  int Q;
  cin >> Q;
  for (int i = 0; i < Q; i ++) {
    int s, t;
    cin >> s >> t;
    s --;
    t --;

    i64 ans = INF;
    ans = min(ans, dist1[s] + dist1[t]);
    ans = min(ans, dist2[s] + dist2[t]);
    ans = min(ans, (i64)abs(s - t));
    cout << ans << endl;
  }
}