var L,s,t,m,n,i,j,v,best:longint;
x:array [0..100] of longint;{由左而右記錄每個石子的位置}
a:array [0..100,0..9] of longint;{a[i,j]為青蛙跳到x[i]-j位置經過的最少石子數}
b:array [-10..90] of boolean;{b[i]記錄能否用s到t這t-s+1種距離從原點到達橫坐標為i的位置}
function can(v:longint):boolean;{判別青蛙能否跳到位置v}
begin
if v<0
then can:=false
else if v>=s*s-s{可以證明,當v≥s(s-1)時,壹定可以用s和s+1兩種跳躍距離到達位置v,所以要對s=t作特殊處理}
then can:=true
else can:=b[v]
end;{can}
begin
assign(input,'river.in');reset(input);{輸入文件讀準備}
readln(L);readln(s,t,m);{讀獨木橋長度、青蛙壹次跳躍的最小距離,最大距離和橋上的石子數}
for i:=1 to m do read(x[i]);{輸入每個石子在數軸上的位置}
readln; close(input);{關閉輸入文件}
for i:=1 to m-1 do{按照由左而右的順序排列石子}
for j:=1 to m-1 do
if x[j]>x[j+1] then begin v:=x[j];x[j]:=x[j+1];x[j+1]:=v end;{ then }
n:=m;while x[n]>L do dec(n);{去除獨木橋外的石子}
if s=t{若青蛙每次跳躍的距離唯壹,則青蛙過河最少需要踩到的石子數best即為坐標位置為s整倍數的石子數}
then begin
best:=0;
for i:=1 to n do if x[i] mod s=0 then inc(best);
assign(output,'river.out');rewrite(output);{輸出文件寫準備}
writeln(best); {輸出best後關閉輸出文件並成功退出}
close(output); halt
end;{ then }
fillchar(b,sizeof(b),false);
b[0]:=true;{計算小範圍的情況}
for i:=1 to 90 do{遞推每壹個坐標位置}
for j:=s to t do {枚舉青蛙壹次跳躍的可能距離,計算青蛙能否跳到坐標位置i}
b[i]:=b[i] or b[i-j];
for i:=0 to n do{狀態轉移方程初始化}
for j:=0 to t-1 do a[i,j]:=n+1;
x[0]:=0;{在0位置處增加壹個虛擬的石子}
a[0,0]:=0;{ 青蛙在0位置起跳}
for i:=1 to n do{遞推橋上的每壹個石子}
for j:=0 to t-1 do{枚舉每壹個可能的跳前位置}
if x[i]-j<=x[i-1]{如果x[i]-j位置位於石子i-1的左端}
then a[i,j]:=a[i-1,j-x[i]+x[i-1]]
else begin{若x[i]-j位置位於石子i-1的右端,則枚舉每壹個可能的跳前}
for v:=0 to t-1 do
if can(x[i]-j-x[i-1]+v) and (a[i-1,v]<a[i,j]) {若青蛙可以從x[i-1]-v跳到x[i]-j位置,且跳到x[i-1]-v位置經過的最少石子數為目前最少,則取跳到x[i-1]-v位置經過的最少石子數}
then a[i,j]:=a[i-1,v];
if j=0 then inc(a[i,j]){若踩到第I個石子,則經過的石子數+1}
end;{ else }
best:=n+1;
for i:=0 to t-1 do{枚舉青蛙跳出獨木橋前的最後壹個起跳位置,計算經過的石子數,從中找出最優解}
if a[n,i]<best then best:=a[n,i];
assign(output,'river.out');rewrite(output);{輸出文件寫準備}
writeln(best);{輸出最優解}
close(output){關閉輸出文件}
end.