WA #2#3#4#9#10
#include<bits/stdc++.h>
using namespace std;
long long t,n,m,len,d[100005],a[100005],p[100005],ans,g,f;
struct node{
long long be,en;
}jiaoji[100005];
double v[100005],V;
int cmp(node a,node b){
if(a.en==b.en) return a.be<b.be;
return a.en<b.en;
}
void check(int i){
if(a[i]==0){
if(p[m]<d[i]) return;
if(v[i]>V){
ans++;f=1;
int l=1,now=0,r=m;
// if(p[m]<d[i]) return;
while(l<=r){
int mid=(l+r)>>1;
if(p[mid]>=d[i]){
now=mid;
r=mid-1;
}else l=mid+1;
}
jiaoji[++g].be=now;
jiaoji[g].en=n;
}
}else if(a[i]<0){
int l=1,now=0,r=m;
if(p[m]<d[i]) return;
while(l<=r){
int mid=(l+r)>>1;
if(p[mid]>=d[i]){
now=mid;
r=mid-1;
}else l=mid+1;
}
l=now,r=m;
double s=p[l]-d[i];
if(v[i]*v[i]+2*a[i]*s>V*V){
ans++;
// g++;
jiaoji[++g].be=l;
while(l<=r){
int mid=(l+r)>>1;
if(v[i]*v[i]+2*a[i]*(p[mid]-d[i])>V*V){
now=mid;
l=mid+1;
}else r=mid-1;
}
jiaoji[g].en=now;
}
}else{
if(p[m]<d[i]) return;
double s=p[m]-d[i];
if(v[i]*v[i]+2*a[i]*s>V*V){
ans++;
f=1;
int l=1,now=0,r=m;
// if(p[m]<d[i]) return;
while(l<=r){
int mid=(l+r)>>1;
if(p[mid]>=d[i]){
now=mid;
r=mid-1;
}else l=mid+1;
}
jiaoji[++g].be=now;
jiaoji[g].en=m;
}
}
}
void slove(){
for(int i=1;i<=g;i++) jiaoji[i].be=jiaoji[i].en=0;
ans=f=g=0;
cin>>n>>m>>len>>V;
for(int i=1;i<=n;i++) cin>>d[i]>>v[i]>>a[i];
for(int i=1;i<=m;i++) cin>>p[i];
for(int i=1;i<=n;i++){
check(i);
}
cout<<ans<<" ";
// if(g!=0) cout<<g+f<<endl;
ans=(g>0);
sort(jiaoji+1,jiaoji+g+1,cmp);
int x=jiaoji[1].en;
for(int i=2;i<=g;i++){
// cout<<jiaoji[i].be<<" "<<jiaoji[i].en<<endl;
if(jiaoji[i].be>x){
ans++;
x=jiaoji[i].en;
}
}
// if(f&&x!=m) ans++;
cout<<m-ans<<endl;
// else{
// cout<<m-1<<endl;
// }
}
int main(){
// freopen("detect5.in","r",stdin);
// freopen("detect.out","w",stdout);
cin>>t;
while(t--){
slove();
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
/*
1
5 5 15 3
0 3 0
12 4 0
1 1 4
5 5 -2
6 4 -4
2 5 8 9 15
*/