#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define int ll

#define REP(i,n) for(int i=0;i<n;++i)
#define SORT(name) sort(name.begin(), name.end())
#define ZERO(p) memset(p, 0, sizeof(p))
#define MINUS(p) memset(p, -1, sizeof(p))
#if 1
#  define DBG(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
#  define DBG(fmt, ...)
#endif

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const double DINF = std::numeric_limits<double>::infinity();
const int MOD = 1000000007;
#define MAX_N 100010

// v の [lb, ub) の範囲で val 以上の要素が初めて出てくるインデックスを返す
// なければ -1 を返す
// -1 を返すとこ以外 std::lower_bound と同じ
// 同じ数が複数ある場合は一番小さいインデックスを返す
static inline ll bin_search2(const vector<ll>& v, ll lb, ll ub, ll val) {
    lb--; ub--;
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        if(v[mid] >= val) { ub = mid; }
        else { lb = mid; }
    }
    // この時点で lb + 1 = ub
    return (v[ub] >= val) ? ub : -1;
}
// [lb, ub) の範囲で val 以下の要素で最大のもののインデックスを返す
// なければ -1 を返す
// 同じ数が複数ある場合は一番小さいインデックスを返す
static inline ll bin_search4(const vector<ll>& v, ll lb, ll ub, ll val) {
    lb--; ub--;
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        if(v[mid] >= val) { ub = mid; }
        else { lb = mid; }
    }
    // この時点で lb + 1 = ub
    if(v[ub] <= val) { return ub; }
    if(lb < 0 || v[lb] > val) { return -1; }
    return lb;
}

ll A, B, Q;
vector<ll> S, T, X;

enum Direction { Left = 0, Right = 1 };
enum Building { Shrine = 0, Temple = 1 };
// 現在地が pos で、 dir 方向の一番近い build までの距離と、その地点の pair
// 存在しない場合は {LLINF, -1} を返す
pair<ll, ll> GetDist(ll pos, ll dir, ll build) {
    ll ret = 0;
    if(dir == Right) {
        if(build == Shrine) {
            ret = bin_search2(S, 0, S.size(), pos);
            if(ret == -1) { return make_pair(LLINF, -1); }
            return make_pair(abs(pos - S[ret]), S[ret]);
        }
        else {
            ret = bin_search2(T, 0, T.size(), pos);
            if(ret == -1) { return make_pair(LLINF, -1); }
            return make_pair(abs(pos - T[ret]), T[ret]);
        }
    }
    else {
        if(build == Shrine) {
            ret = bin_search4(S, 0, S.size(), pos);
            if(ret == -1) { return make_pair(LLINF, -1); }
            return make_pair(abs(pos - S[ret]), S[ret]);
        }
        else {
            ret = bin_search4(T, 0, T.size(), pos);
            if(ret == -1) { return make_pair(LLINF, -1); }
            return make_pair(abs(pos - T[ret]), T[ret]);
        }
    }
    if(ret == -1) { return make_pair(LLINF, -1); }
}

signed main()
{
    cin >> A >> B >> Q;
    S.resize(A);
    T.resize(B);
    REP(i, A) { cin >> S[i]; }
    REP(i, B) { cin >> T[i]; }
    REP(i, Q) {
        ll x;
        cin >> x;
        ll ans = LLINF;
        for(ll dir1 = Left; dir1 <= Right; ++dir1) {
            for(ll dir2 = Left; dir2 <= Right; ++dir2) {
                for(ll build1 = Shrine; build1 <= Temple; ++build1) {
                    ll build2 = (build1 == Shrine) ? Temple : Shrine;
                    pair<ll, ll> cand = GetDist(x, dir1, build1);
                    if(cand.first < LLINF) { cand.first += GetDist(cand.second, dir2, build2).first; }
                    ans = min(ans, cand.first);
                }
            }
        }
        printf("%lld\n", ans);
    }

    return 0;
}


Measured memory_bytes: 2944