#include #include #include #include #include #include #include using namespace std; using ll = long long; #define rep(i, j) for(int i=0; i < (int)(j); i++) #define repeat(i, j, k) for(int i = (j); i < (int)(k); i++) #define all(v) v.begin(),v.end() // vector template istream& operator >> (istream &is , vector &v) { for(T &a : v) is >> a; return is; } void fft_base(vector> &f, int sign) { int n = f.size(); if (n == 1) return; assert(n == pow(2, log2(n))); // f.size() must be 2^i vector> f0(n / 2), f1(n / 2); for (int i = 0; i < n / 2; i++) { f0[i] = f[2 * i + 0]; f1[i] = f[2 * i + 1]; } fft_base(f0, sign); fft_base(f1, sign); // zeta := exp{2pi * sqrt(-1) / n} const complex zeta = polar(1.0, sign * 2 * M_PI / n); complex pow_zeta = 1; for (int i = 0; i < n; i++) { f[i] = f0[i % (n / 2)] + pow_zeta * f1[i % (n / 2)]; pow_zeta *= zeta; } return; } vector> fft(vector> f) { int n = f.size(); n = pow(2, ceil(log2(n))); f.resize(n, 0); fft_base(f, 1); return f; } vector> ifft(vector> f) { int n = f.size(); n = pow(2, ceil(log2(n))); f.resize(n, 0); fft_base(f, -1); for (int i = 0; i < n; i++) f[i] /= n; return f; } //畳み込み template vector convolution(const vector &A, const vector &B) { int n = A.size() + B.size() + 1; n = pow(2, ceil(log2(n))); vector> f(n, 0), g(n, 0); for (int i = 0; i < (int)A.size(); i++) f[i] = A[i]; for (int i = 0; i < (int)B.size(); i++) g[i] = B[i]; f = fft(f); g = fft(g); vector> h(n); for (int i = 0; i < n; i++) h[i] = f[i] * g[i]; h = ifft(h); vector ret(n); for (int i = 0; i < n; i++) ret[i] = h[i].real(); return ret; } bool solve() { int L, M, N; cin >> L >> M >> N; vector a(N + 1), b(N + 1); rep(i, L) { int A; cin >> A; a[A] = 1; } rep(i, M) { int B; cin >> B; b[N - B] = 1; } vector c = convolution(a, b); int Q; cin >> Q; rep(i, Q) { cout << (int)round(c[N + i]) << endl; } return false; } int main() { cin.tie(0); ios::sync_with_stdio(false); while(solve()); return 0; }