代码: 555
#include<bits/stdc++.h>
using namespace std;
#define int long long
int f[100005];
int ff[100005][2];
int c[1000005];
int p[100005];
int vis[100005];
struct edge{
int l,r,id;
};
edge fc[100005];
bool cmp(edge x,edge y){
return x.r<y.r;
}
signed main(){
int t;
scanf("%lld",&t);
while(t--){
int n,m,L,V;
int k=0,kk=0;
scanf("%lld%lld%lld%lld",&n,&m,&L,&V);
memset(c,0,sizeof(c));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
int d,v,a;
scanf("%lld%lld%lld",&d,&v,&a);
if(a==0){
if(v>V) f[++k]=d-1;
else {
ff[++kk][0]=-1;
ff[kk][1]=-1;
}
}
else if(a>0){
int len=max((long long)floor((V*V-v*v)/(2*a)),0LL);
f[++k]=min(L,len+d);
}
else{
int len=max((long long)floor((V*V-v*v)/(2*a))+1,0LL);
ff[++kk][0]=d;
ff[kk][1]=min(L+1,len+d);
}
}
for(int i=1;i<=m;i++){
int x;
scanf("%lld",&x);
c[x]=1;
p[i]=x;
}
sort(p+1,p+m+1);
int tt=0,cntt=0;
for(int i=1;i<=L+1;i++) c[i]+=c[i-1];
for(int i=1;i<=k;i++) {
if(c[f[i]]<m) tt=max(tt,f[i]),cntt++;
}
for(int i=1;i<=kk;i++) {
fc[i].l=ff[i][0];
fc[i].r=ff[i][1];
fc[i].id=i;
}
for(int i=1;i<=kk;i++){
if(c[ff[i][1]-1]-c[ff[i][0]-1]>0){
vis[i]=1;
cntt++;
}
}
// for(int i=1;i<=kk;i++) cout<<ff[i][0]<<" "<<ff[i][1]<<" "<<vis[i]<<endl;
sort(fc+1,fc+kk+1,cmp);
int last=0,cnt=0;
for(int i=1;i<=kk;i++){
if(vis[fc[i].id]==1){
if(p[last]<fc[i].l){
while(p[last]<fc[i].r&&last<=m) last++;
last--;
cnt++;
}
}
}
if(p[last]<=tt) cnt++;
cout<<cntt<<" "<<m-cnt<<endl;
}
return 0;
}