/* -*- coding: utf-8 -*- * * 3072.cc: No.3072 Speedrun Query - yukicoder */ #include<cstdio> #include<algorithm> using namespace std; /* constant */ const int MAX_N = 300000; const int INF = 1 << 30; /* typedef */ /* global variables */ int as[MAX_N], bs[MAX_N]; /* subroutines */ int distv(int k, int vs[], int x) { int i = lower_bound(vs, vs + k, x) - vs; int d = INF; if (i < k) d = min(d, vs[i] - x); if (i > 0) d = min(d, x - vs[i - 1]); return d; } /* main */ int main() { int n, ka, kb; scanf("%d%d%d", &n, &ka, &kb); for (int i = 0; i < ka; i++) scanf("%d", as + i); for (int i = 0; i < kb; i++) scanf("%d", bs + i); int minab = INF; for (int i = 0, j = 0; i < ka && j < kb;) { minab = min(minab, abs(bs[j] - as[i])); if (as[i] == bs[j]) break; if (as[i] < bs[j]) i++; else j++; } //printf(" minab = %d\n", minab); int qn; scanf("%d", &qn); while (qn--) { int s, t; scanf("%d%d", &s, &t); // (1) s->t int d = abs(t - s); // (2) s->(a)->t int dsa = distv(ka, as, s), dta = distv(ka, as, t); d = min(d, dsa + dta); // (3) s->(b)->t int dsb = distv(kb, bs, s), dtb = distv(kb, bs, t); d = min(d, dsb + dtb); // (4) s->(a)->(b)->t d = min(d, dsa + minab + dtb); // (5) s->(b)->(a)->t d = min(d, dsb + minab + dta); printf("%d\n", d); } return 0; }