import java.io.*;
import java.util.*;
class Solution{
static long mod = (long)1e9+7L;
int n;
long k, b;
long[] a;
long[] memo;
public void solve(){
n=ni(); //taking input, n is size of input array.
k=nl(); b=nl();
a=new long[n];
memo=new long[n];
for(int i=0; i<n; i++)a[i]=nl(); //taking input of array
if(k == 0){ //seprate case when k=0.
int ct=0;
for(int i=0; i<n; i++){
if(a[i] >= b)ct+=1;
}
if(a[0] < b)ct+=1;
out.println(ct);
}
else{ //when k>0.
out.println(f(n-1));
}
}
long f(int id){ //top-down dp approach.
//out.println(id);
if(id<0)return 0;
if(memo[id] != -1){
return memo[id];
}
if(id == 0){
return memo[id] = 1;
}
memo[id] = f(id-1);
long nxt
= (a
[id
]-b
)/Math.
max(1L, k
); int id1 = bs(0, id-1, nxt); //binary search for finding the index of nxt in the sorted array.
memo
[id
] = Math.
max(memo
[id
],
1+f
(id1
)); return memo[id];
}
int bs(int l, int r, long key){ //binary search function.
while(l<r){
int mid=l+(r-l+1)/2;
if(a[mid] <= key)l=mid;
else r=mid-1;
}
if(a[l] <= key){
return l;
}
else{
return -1;
}
}
//below is code for fast io.
void run(){
int t=ni();while(t-->0)solve();
out.flush();
}
public static void main
(String[] args
)throws Exception{new Solution
().
run();} long mod
(long v,
long m
){if(v
<0){long q
=(Math.
abs(v
)+m
-1L
)/m
;v
=v
+q
*m
;}return v
%m
;} long mod
(long v
){if(v
<0){long q
=(Math.
abs(v
)+mod
-1L
)/mod
;v
=v
+q
*mod
;}return v
%mod
;} //Fast I/O code is copied from uwi code.
private byte[] inbuf = new byte[1024];
public int lenbuf = 0, ptrbuf = 0;
private int readByte(){
if(lenbuf == -1)throw new InputMismatchException();
if(ptrbuf >= lenbuf){
ptrbuf = 0;
try { lenbuf
= is.
read(inbuf
); } catch (IOException e
) { throw new InputMismatchException
(); } if(lenbuf <= 0)return -1;
}
return inbuf[ptrbuf++];
}
private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
private double nd
() { return Double.
parseDouble(ns
()); } private char nc() { return (char)skip(); }
int b = skip();
StringBuilder sb = new StringBuilder();
while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}
private char[] ns(int n){
char[] buf = new char[n];
int b = skip(), p = 0;
while(p < n && !(isSpaceChar(b))){
buf[p++] = (char)b;
b = readByte();
}
return n
== p
? buf
: Arrays.
copyOf(buf, p
); }
private char[][] nm(int n, int m){
char[][] map = new char[n][];
for(int i = 0;i < n;i++)map[i] = ns(m);
return map;
}
private int[] na(int n){
int[] a = new int[n];
for(int i = 0;i < n;i++)a[i] = ni();
return a;
}
private int ni(){
int num = 0, b;
boolean minus = false;
while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
if(b == '-'){
minus = true;
b = readByte();
}
while(true){
if(b >= '0' && b <= '9'){
num = num * 10 + (b - '0');
}else{
return minus ? -num : num;
}
b = readByte();
}
}
private long nl(){
long num = 0;
int b;
boolean minus = false;
while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
if(b == '-'){
minus = true;
b = readByte();
}
while(true){
if(b >= '0' && b <= '9'){
num = num * 10 + (b - '0');
}else{
return minus ? -num : num;
}
b = readByte();
}
}
static int i
(long x
){return (int)Math.
round(x
);} static class Pair implements Comparable<Pair>{
long fs,sc;
Pair(long a,long b){
fs=a;sc=b;
}
public int compareTo(Pair p){
if(this.fs>p.fs)return 1;
else if(this.fs<p.fs)return -1;
else{
return i(this.sc-p.sc);
}
//return i(this.sc-p.sc);
}
return "("+fs+","+sc+")";
}
}
}