#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <iomanip>//io控制头文件 cout<<fixed<<setprecision(3)<<ans<<"\n";
#define ms(x,n) memset(x,n,sizeof x)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=1000+10;
int t,n,m,x,y,M;
struct edge{
int lx,rx,h;
bool operator <(const edge &c) const{
return h>c.h;
}
}e[N];
int dp[2][N];
void lefttime(int i){ //只考虑最近路径的由下往上搜索,巧妙利用return
int k=i+1;
while(k<=n&&e[i].h-e[k].h<=M){
if(e[k].lx<=e[i].lx&&e[i].lx<=e[k].rx){
dp[0][i]=e[i].h-e[k].h+min(dp[0][k]+e[i].lx-e[k].lx,dp[1][k]+e[k].rx-e[i].lx);
return ;
}
k++;
}
if(e[i].h-e[k].h>M){
dp[0][i]=inf;
}
else dp[0][i]=e[i].h;
}
void righttime(int i){
int k=i+1;
while(k<=n&&e[i].h-e[k].h<=M){
if(e[k].lx<=e[i].rx&&e[i].rx<=e[k].rx){
dp[1][i]=e[i].h-e[k].h+min(dp[0][k]+e[i].rx-e[k].lx,dp[1][k]+e[k].rx-e[i].rx);
return ;
}
k++;
}
if(e[i].h-e[k].h>M){
dp[1][i]=inf;
}
else dp[1][i]=e[i].h;
}
int main()
{
cin>>t;
while(t--){
ms(dp,inf);
e[0].lx=-20000,e[0].rx=20000,e[0].h=0;
cin>>n>>x>>y>>M;
e[1].lx=x,e[1].rx=x,e[1].h=y;
for(int i=2;i<=n+1;i++){
scanf("%d%d%d",&e[i].lx,&e[i].rx,&e[i].h);
}
sort(e,e+2+n);
for(int i=n;i>=0;i--){
lefttime(i);
righttime(i);
}
cout<<min(dp[0][0],dp[1][0])<<"\n";
}
return 0;
}
只考虑最近路径的由下往上搜索,巧妙利用return