WA on #5,#6
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q,n,m,ans0=0,ans1=0;
double L,k;
struct node{
double di,v,a;
}qwq[100005];
int a[100005];
vector<pair<int,int> > ans;
bool cmp(pair<int,int> x,pair<int,int> y){
if(x.second==y.second) return x.first<y.first;
return x.second<y.second;
}
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
void ChongYun(){
ans0=ans1=0; ans.clear();
n=read(); m=read(); L=read()*1.0; k=read()*1.0;
for(int i=1;i<=n;i++){
qwq[i].di=read();
qwq[i].v=read();
qwq[i].a=read();
}
for(int i=1;i<=m;i++) a[i]=read();
for(int i=1;i<=n;i++){
int l=0,r=0;
if(qwq[i].a==0){
if(qwq[i].v>k&&qwq[i].di<=a[m]){
l=lower_bound(a+1,a+m+1,qwq[i].di)-a; r=m;
if(l<=r) ++ans0,ans.push_back({l,r});
}
}else if(qwq[i].a>0){
double now=(k*k-qwq[i].v*qwq[i].v)/(2.0*qwq[i].a);
if(qwq[i].di<=a[m]&&qwq[i].di+now<=a[m]){
l=lower_bound(a+1,a+m+1,qwq[i].di+now)-a; r=m;
if(l<=r) ++ans0,ans.push_back({l,r});
}
}else{
double now=(k*k-qwq[i].v*qwq[i].v)/(2.0*qwq[i].a);
if(qwq[i].v>k&&qwq[i].di<=a[m]&&now>=0){
l=lower_bound(a+1,a+m+1,qwq[i].di)-a;
r=lower_bound(a+1,a+m+1,qwq[i].di+now)-a;
if(a[r]!=qwq[i].di) r--;
if(l<=r) ++ans0,ans.push_back({l,r});
}
}
}
printf("%lld ",ans0);
sort(ans.begin(),ans.end(),cmp);
int lst=0;
for(auto i:ans){
if(i.first>lst||lst>i.second){
ans1++;
lst=i.second;
}
}
printf("%lld\n",m-ans1);
return ;
}
signed main(){
q=read();
while(q--) ChongYun();
return 0;
}