WA on #6,#8,#10
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int d[N],v[N],n,m,L,V;
int p[N];
int a[N];
int f(int V,int x,int y){
return (V*V-x*x)/(2*y);
}
struct P{
int l,r;
}x[N];
bool cmp(P x,P y){
return x.r<y.r;
}
int erfen(int m,int x){
int h=1,w=m,ans=0;
while(h<=w){
int mid=(h+w)/2;
if(p[mid]<=x) {
ans=mid;
h=mid+1;
}else w=mid-1;
}
return ans;
}
void solve(){
for(int i=0;i<N;i++) d[i]=v[i]=a[i]=x[i].l=x[i].r=p[i]=0;
cin>>n>>m>>L>>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];
sort(p+1,p+1+m);
for(int i=1;i<=n;i++) {
if(a[i]<0){
if(v[i]<=V) x[i].l=x[i].r=-1;
else{
x[i].l=d[i];
x[i].r=min(L,d[i]+f(V,v[i],a[i]));
}
}
else if(a[i]==0){
if(v[i]<=V) x[i].l=x[i].r=-1;
else{
x[i].l=d[i];
x[i].r=L;
}
}
else if(a[i]>0) {
if(v[i]<=V){
x[i].l=min(L,d[i]+f(V,v[i],a[i])+1);
x[i].r=L;
}else{
x[i].l=d[i];
x[i].r=L;
}
}
}
sort(x+1,x+1+n,cmp);
int lst=0,sum=0,ans=0;
for(int i=1;i<=n;i++) {
if(x[i].l==-1&&x[i].r==-1) continue;
int k=erfen(m,x[i].r);
//cout<<x[i].l<<" "<<x[i].r<<" "<<k<<" "<<p[k]<<endl;
if(p[k]>=x[i].l&&p[k]<=x[i].r){
sum++;
if(!(lst>=x[i].l&&lst<=x[i].r)){
ans++;
lst=p[k];
}
}
}
cout<<sum<<" "<<m-ans<<'\n';
ans=sum=lst=0;
n=m=0;
return ;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--) solve();
}```