#include<bits/stdc++.h>
using namespace std;
int T,n,m,ans1,ans2;
double L,V,d[100001],v[100001],a[100001],p[100001];
struct node{int a=0,b=0;}s[100001];
int read(){
int x=0,f=0;char c=cin.get();
for(;!isdigit(c);c=cin.get())if(c=='-')f=1;
for(;isdigit(c);c=cin.get())x=(x<<1)+(x<<3)+c-'0';
return f?-x:x;
}int main(){
T=read();
while(T--){
n=read();m=read();L=read();V=read();
memset(s,0,sizeof(s));ans1=0;ans2=m;
for(int i=1;i<=n;i++)d[i]=read(),v[i]=read(),a[i]=read();
for(int i=1;i<=m;i++)p[i]=read();
for(int i=1;i<=n;i++){
if(v[i]>V&&a[i]>=0){
s[i].a=lower_bound(p+1,p+m+1,d[i])-p;
s[i].b=m;
}else if(a[i]>0){
double dis=d[i]+(V*V-v[i]*v[i])/(2*a[i]);
s[i].a=upper_bound(p+1,p+m+1,dis)-p;
s[i].b=m;
}else if(a[i]<0&&v[i]>V){
double dis=d[i]+(V*V-v[i]*v[i])/(2*a[i]);
s[i].a=lower_bound(p+1,p+m+1,d[i])-p;
s[i].b=upper_bound(p+1,p+m+1,dis)-p-1;
}if(s[i].a>s[i].b)s[i].a=s[i].b=0;
if(s[i].a&&s[i].b)ans1++;
}sort(s+1,s+n+1,[](node a,node b){return a.a!=b.a?a.a>b.a:a.b>b.b;});
sort(s+1,s+ans1+1,[](node a,node b){return a.a!=b.a?a.a<b.a:a.b<b.b;});
for(int i=1;i<=ans1;i++){
int j=i+1,l=s[i].a,r=s[i].b;
for(;j<=ans1;j++){
if(max(l,s[j].a)<=min(r,s[j].b)){
l=max(l,s[j].a);r=min(r,s[j].b);
}else break;
}j--;i=j;ans2--;
}cout<<ans1<<' '<<ans2<<'\n';
}
}
所有样例都A了