import java.io.*;
import java.util.*;
public class twoPlatforms {
static int t;
static int n, k;
static int[] x;
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);
t = Integer.parseInt(in.readLine());
for (int test = 0; test < t; test++) {
StringTokenizer st = new StringTokenizer(in.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
st = new StringTokenizer(in.readLine());
x = new int[n];
for (int i = 0; i < n; i++) {
x[i] = Integer.parseInt(st.nextToken());
}
int[] y = new int[n];
st = new StringTokenizer(in.readLine());
for (int i = 0; i < n; i++) {
y[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(x);
out.println(solve());
}
out.close();
}
static int solve(){
int maxLeft = 0;
int ans = 0;
for(int i = 0; i < n; i++){
int r = binSearch(x[i] + k, 1);
int rLength;
if(r < 0){
if(r == -1) {
r = -(r + 1);
}
else if(r == -n — 1){
r = n — 1;
}
else{
r = -(r + 1) — 1;
}
}
rLength = r — i + 1;
int lLength = 0;
if(i != 0) {
int l = binSearch(x[i — 1] — k, -1);
if(l < 0){
l = -(l + 1);
}
lLength = i — l;
}
maxLeft = Math.max(lLength, maxLeft);
ans = Math.max(ans, maxLeft + rLength);
}
return ans;
}
static int binSearch(int target, int dir){
int l = 0, r = n;
int res = (dir == 1) ? 0 : Integer.MAX_VALUE;
boolean found = false;
while(l != r ){
int m = (l + r)/2;
if(x[m] < target){
l = m + 1;
}
else if(x[m] > target){
r = m;
}
else{
found = true;
res = (dir == 1) ? Math.max(m, res) : Math.min(m, res);
if(dir == 1){
l = m + 1;
}
else{
r = m;
}
if(l < n && l == r && x[l] == target){
res = (dir == 1) ? Math.max(l, res) : Math.min(l, res);
}
}
}
if(found){
return res;
}
else{
return -(l + 1);
}
}
}