```cpp
#include<bits/stdc++.h>
using namespace std;
long long t;
const long long N = 2e5 + 10;
long long n,m,q,tot;
long long s[N],c[N],p[N];
struct node {
long long l,r;
bool operator < (const node &a) const {
return r < a.r;
}
}in[N];
void solve() {
//考虑记录下看每部剧的最早时间,由于剧必须按顺序观看,所以该时间序列一定是不减的,这样对于每个询问就可以二分找出答案
cin >> n >> m >> q;
for(long long i = 1;i <= n;i++) cin >> in[i].l;
for(long long i = 1;i <= n;i++) cin >> in[i].r;
sort(in + 1,in + 1 + n);
for(long long i = 1;i <= m;i++) cin >> c[i];
long long j = 1,tt = 0;
for(long long i = 1;i <= n;i++) {
while(j > 0 && tt + in[i].l > in[i].r) {
//此处反悔,即如果前面看剧导致此时作业不能按时完成,那就让前面看的剧少一些,直到能按时完成,并且退回去的剧所对应的最早时间也要打回成无穷大
j--;
tt -= c[j];
p[j] = 1e9;
}
while(j <= m && tt + c[j] + in[i].l <= in[i].r) {
//如果做完作业的基础上还能看剧,那就一直看
tt += c[j];
p[j] = tt;
j++;
}
tt += in[i].l;
}
while(j <= m) {
//如果做完了作业还有剧没看完,就补上
tt += c[j];
p[j++] = tt;
}
for(long long v,i = 1;i <= q;i++) {
cin >> v;
cout << upper_bound(p + 1,p + 1 + m,v) - p - 1 << ' ';
}
cout << '\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> t;
while(t--) solve();
return 0;
}