#include<bits/stdc++.h>
using namespace std;
#define int long long
struct spd
{
int l,r;
bool flag;
const bool operator<(const spd sd)const
{
// if(flag==false)return false;
// if(sd.flag==false)return true;
if(r<sd.r)return true;
return false;
}
}arr[100007];
int moni[100007];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("detect4.in","r",stdin);
freopen("d.out","w",stdout);
#endif
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--)
{
int n,m,L,V,d,v,a;
cin>>n>>m>>L>>V;
vector<int>vc;
for(int i=0;i<n;i++)
{
cin>>d>>v>>a;
if(a==0)
{
if(v<=V)arr[i]=spd{-1,-1,false};
else arr[i]=spd{d,L,true};
}
else
{
if(v>V&&a>=0)
{
arr[i]=spd{d,L,true};
continue;
}
if(v<=V&&a<=0)
{
arr[i]=spd{-1,-1,false};
continue;
}
double s0=1.0*(V+v)*(V-v)/(2*a)+d;
if(s0>L&&a<0||s0<d&&a>0)
{
arr[i]=spd{d,L,true};
continue;
}
if(s0<d||s0>L)
{
arr[i]=spd{-1,-1,false};
continue;
}
if(a<0)arr[i]=spd{d,(int)(floor(s0+0.0004)),true};
else arr[i]=spd{(int)(ceil(s0-0.0004)),L,true};
}
}
for(int i=0;i<m;i++)cin>>moni[i];
sort(moni,moni+m);
int ans=0,cnt=0;
for(int i=0;i<n;i++)
{
if(arr[i].flag==false)
{
//cerr<<i<<'\n';
continue;
}
int ll=arr[i].l,rr=arr[i].r;
auto li=lower_bound(moni,moni+m,ll),ri=upper_bound(moni,moni+m,rr);
if(li==ri) arr[i].flag=false;
else ans++;
}
cout<<ans<<' ';
sort(arr,arr+n);
for(int i=0;i<n;i++)
{
if(arr[i].flag==false)continue;
if(vc.empty()||*vc.rbegin()<arr[i].l)
{
vc.push_back(*(upper_bound(moni,moni+m,arr[i].r)-1));
cnt++;
}
}
cout<<m-cnt<<'\n';
}
return 0;
}
找到锅了踢我一下,好吧