#include<bits/stdc++.h>
using namespace std;
struct AF{
int l,r;
}af[100002];
bool cmp1(AF a,AF b){
return a.r!=b.r?a.r<b.r:a.l<b.l;
}
int az[100002],p[100002];
signed main(){
p[0]=-1;
int t;
scanf("%d",&t);
while(t--){
int n,m,l,vm,vf;
scanf("%d%d%d%d",&n,&m,&l,&vm);
vf=vm*vm;
int d,v,a,cntf=0,cntz=0,r;
for(register int i=0;i<n;++i){
scanf("%d%d%d",&d,&v,&a);
if(v>vm){
if(a<0){
v=vf-v*v;
a<<=1;
r=d+v/a-(v%a==0);
if(r<l)af[cntf++]=(AF){d,r};
else az[cntz++]=d;
}else az[cntz++]=d;
}else if(a>0){
if(v<vm){
d+=(vf-v*v)/(a<<=1);
if(d<l)az[cntz++]=d+1;
}else az[cntz++]=d+1;
}
}
sort(af,af+cntf,cmp1);
int ansf=0,cntp=0,pl=0,pr;
for(register int i=1;i<=m;++i)scanf("%d",p+i);
for(register int i=0;i<cntf;++i){
if(af[i].l<=p[pl])++ansf;
else{
pr=upper_bound(p+1,p+m+1,af[i].r)-p-1;
if(af[i].l<=p[pr]){
++ansf;
++cntp;
pl=pr;
}
}
}
sort(az,az+cntz);
int ansz=upper_bound(az,az+cntz,p[m])-az;
printf("%d %d\n",ansf+ansz,m-cntp-(p[pl]<az[ansz-1]));
}
return 0;
}