#include using namespace std; using i64 = int_fast64_t; using ui64 = uint_fast64_t; #define REP(i, n) for (i64 (i) = 0; (i) < (n); ++(i)) #define FOR(i, a, b) for (i64 (i) = (a); (i) < (b); ++(i)) namespace FastFourierTransform { using C = complex< double >; void DiscreteFourierTransform(vector &F, bool rev) { const int N = (int)F.size(); const double PI = (rev ? -1 : 1) * acos(-1); for (int i = 0, j = 1; j + 1 < N; ++j) { for (int k = N >> 1; k > (i ^= k); k >>= 1); if (i > j) swap(F[i], F[j]); } C w, s, t; for (int i = 1; i < N; i <<= 1) { for (int k = 0; k < i; ++k) { w = polar(1.0, PI / i * k); for (int j = 0; j < N; j += i * 2) { s = F[j + k]; t = C( F[j + k + i].real() * w.real() - F[j + k + i].imag() * w.imag(), F[j + k + i].real() * w.imag() + F[j + k + i].imag() * w.real() ); F[j + k] = s + t, F[j + k + i] = s - t; } } } if (rev) for (int i = 0; i < N; ++i) F[i] /= N; } vector Multiply(const vector &A, const vector &B) { int sz = 1; while (sz < A.size() + B.size() - 1) sz <<= 1; vector F(sz), G(sz); for (int i = 0; i < A.size(); ++i) F[i] = A[i]; for (int i = 0; i < B.size(); ++i) G[i] = B[i]; DiscreteFourierTransform(F, false); DiscreteFourierTransform(G, false); for (int i = 0; i < sz; ++i) F[i] *= G[i]; DiscreteFourierTransform(F, true); vector X(A.size() + B.size() - 1); for (int i = 0; i < A.size() + B.size() - 1; ++i) X[i] = F[i].real() + 0.5; return (X); } }; int L, M, N, Q; vector A, B; vector inA, inB; signed main() { cin >> L >> M >> N; inA.resize(N + 1); inB.resize(N + 1); A.resize(L); REP(i, L) { cin >> A[i]; inA[A[i]] = 1; } B.resize(M); REP(i, M) { cin >> B[i]; inB[N - B[i]] = 1; } auto C = FastFourierTransform::Multiply(inA, inB); cin >> Q; for (int i = 0; i < Q; ++i) { cout << C[N + i] << endl; } }