N,D=map(int,input().split())
A=list(map(int,input().split()))
C=[N for i in range(N)]
# N: 処理する区間の長さ
N = ...
def gindex(l, r):
L = (l + N0) >> 1; R = (r + N0) >> 1
lc = 0 if l & 1 else (L & -L).bit_length()
rc = 0 if r & 1 else (R & -R).bit_length()
for i in range(LV):
if rc <= i:
yield R
if L < R and lc <= i:
yield L
L >>= 1; R >>= 1
# 遅延伝搬処理
def propagates(*ids):
for i in reversed(ids):
v = lazy[i-1]
if v is None:
continue
lazy[2*i-1] = lazy[2*i] = data[2*i-1] = data[2*i] = v >> 1
lazy[i-1] = None
# 区間[l, r)をxに更新
def update(l, r, x):
*ids, = gindex(l, r)
propagates(*ids)
L = N0 + l; R = N0 + r
v = x
while L < R:
if R & 1:
R -= 1
lazy[R-1] = data[R-1] = v
if L & 1:
lazy[L-1] = data[L-1] = v
L += 1
L >>= 1; R >>= 1; v <<= 1
for i in ids:
data[i-1] = data[2*i-1] + data[2*i]
# 区間[l, r)内の合計を求める
def query(l, r):
propagates(*gindex(l, r))
L = N0 + l; R = N0 + r
s = 0
while L < R:
if R & 1:
R -= 1
s += data[R-1]
if L & 1:
s += data[L-1]
L += 1
L >>= 1; R >>= 1
return s
data=A
def binary_search(data, value):
left = 0 # 探索する範囲の左端を設定
right = len(data) - 1 # 探索する範囲の右端を設定
while left <= right:
mid = (left + right) // 2 # 探索する範囲の中央を計算
if data[mid] == value:
# 中央の値と一致した場合は位置を返す
return mid
elif data[mid] < value:
# 中央の値より大きい場合は探索範囲の左を変える
left = mid + 1
else:
# 中央の値より小さい場合は探索範囲の右を変える
right = mid - 1
return -1 # 見つからなかった場合
#これは事故らない二分探索です
def binary_min(data, lower_bound):
value=lower_bound
left = 0 # 探索する範囲の左端を設定
right = len(data) - 1 # 探索する範囲の右端を設定
while left < right:
mid = (left + right) // 2# 探索する範囲の中央を計算
if data[mid] < value:
# 中央の値より大きい場合は探索範囲の左を変える
left = mid +1
else:
# 中央の値より小さい場合は探索範囲の右を変える
right = mid
mid = (left + right) // 2
return mid # 見つからなかった場合
#これは事故らない二分探索です
def binary_max(data, upper_bound):
value=upper_bound
left = 0 # 探索する範囲の左端を設定
right = len(data) - 1 # 探索する範囲の右端を設定
while left < right:
mid = (left + right+1) // 2# 探索する範囲の中央を計算
if data[mid] > value:
# 中央の値より大きい場合は探索範囲の左を変える
right = mid -1
else:
# 中央の値より小さい場合は探索範囲の右を変える
left = mid
mid = (left + right) // 2
return mid # 見つからなかった場合
for y in range(1) :
V=data.copy()
V=sorted(V)
last="^o^"
E=[]
F=[]
for i in range(len(V)):
if V[i]!=last :
E.append(V[i])
last=V[i]
for i in range(len(V)) :
F.append(binary_search(E,data[i]))
R={}
for i in range(len(E)) :
R[E[i]]=i
LV = (len(E)-1).bit_length()
N0 = 2**LV
data = [0]*(2*N0)
lazy = [None]*(2*N0)
N=len(A)
ans=0
for i in range(N) :
l=binary_min(E,A[i]-D+1)
r=binary_max(E,A[i]+D-1)
update(l,r+1,0)
update(F[i],F[i]+1,1)
ans+=query(0,len(E))
print(ans)