#include #include #include #include using namespace std; int L, M, N; int Q; vector> DFT(vector> f, bool inverse){ if(f.size() == 1) return f; vector> va, vb; for(int i = 0; i < f.size(); i++){ if(i % 2 == 0) va.push_back(f[i]); else vb.push_back(f[i]); } va = DFT(va, inverse); vb = DFT(vb, inverse); double c = inverse ? 1.0 : -1.0; complex cur = complex(1.0, 0.0); complex zeta = polar(1.0, c * acos(0.0) * 4.0 / (double)f.size()); vector> res; for(int i = 0; i < f.size(); i++){ res.push_back(va[i % (f.size() / 2)] + cur * vb[i % (f.size() / 2)]); cur *= zeta; } return res; } vector FFT(vector f, vector g){ vector> cf, cg; int n = 1; for(;;){ if(n >= f.size() + g.size()) break; n *= 2; } cf.resize(n); cg.resize(n); for(int i = 0; i < f.size(); i++) cf[i] = complex(f[i], 0.0); for(int i = 0; i < g.size(); i++) cg[i] = complex(g[i], 0.0); cf = DFT(cf, true); cg = DFT(cg, true); for(int i = 0; i < n; i++) cf[i] *= cg[i]; cf = DFT(cf, false); vector res; for(int i = 0; i < n; i++) res.push_back(cf[i].real() / (double)n); return res; } int main(){ scanf("%d %d %d", &L, &M, &N); vector va(N), vb(N); for(int i = 0; i < L; i++){ int a; scanf("%d", &a); a--; va[a] += 1.0; } for(int i = 0; i < M; i++){ int a; scanf("%d", &a); a--; vb[N - a - 1] += 1.0; } vector c = FFT(va, vb); scanf("%d", &Q); for(int i = 0; i < Q; i++) printf("%d\n", (int)floor(c[i + N - 1] + 0.0001)); return 0; }