Загрузка данных


import sys
from bisect import bisect_left, bisect_right

def solve():
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    
    n = int(input_data[0])
    t = int(input_data[1])
    arr = [int(x) for x in input_data[2:]]
    
    # Сортируем массив цен для быстрого поиска
    arr.sort()
    
    total_ways = 0
    
    # Перебираем каждый товар в качестве первого
    for i in range(n):
        val = arr[i]
        
        # 1. Ищем количество возможных вторых товаров: |B - val| <= t  <=>  val - t <= B <= val + t
        # Исключаем сам элемент i, поэтому считаем диапазон и вычитаем 1, если элемент попадает внутрь
        left_bound = val - t
        right_bound = val + t
        
        # Количество элементов в диапазоне [left_bound, right_bound]
        idx1 = bisect_left(arr, left_bound)
        idx2 = bisect_right(arr, right_bound)
        count_b = idx2 - idx1
        
        # Так как сам элемент arr[i] тоже попадает в этот диапазон (ведь 0 <= t), 
        # исключаем его из возможных выборов на 2-ю позицию (товары должны быть разными)
        count_b -= 1
        
        # 2. Ищем количество возможных третьих товаров: |C - val| > t  <=>  C < val - t  или  C > val + t
        # Общее количество элементов минус те, которые лежат в диапазоне [val - t, val + t]
        count_c = n - (idx2 - idx1)
        
        # На каждую пара (второй, третий) для данного первого элемента добавляется count_b * count_c способов
        total_ways += count_b * count_c
        
    print(total_ways)

if __name__ == '__main__':
    solve()