#include #include #define MAX 100000 int cmp_ll(const void *a, const void *b){ int x = *(int *)a; int y = *(int *)b; if(x < y) return -1; if(x > y) return 1; return 0; } int find( int N, int target, int *uniq){ int left= 0; int right = N-1; while(left <= right){ int mid = (left + right)/2; if (uniq[mid] < target) left =mid+1; else if(uniq[mid]==target) return mid ; else right = mid-1; } return -1; } int main(void){ int N,D; int A[MAX]={0}, sortA[MAX]={0}, uniq[MAX]={0}, freqL[MAX]={0}, freqR[MAX]={0}; int M=0; long long ans = 0; int MAX_number=0; scanf("%d", &N); scanf("%d", &D); for(int l = 0; l < N ; l++){ scanf("%d", &A[l]); sortA[l] = A[l]; } qsort(sortA, N, sizeof(int), cmp_ll); for(int l= 0; l < N ; l++){ if(l == 0 || sortA[l] != sortA[l-1]){ uniq[M]=sortA[l]; M++; } freqR[M-1]++; } for(int l = 0; l < N ;l++){ int x=A[l]; int idR = find(M, x, uniq); freqR[idR]--; int i = find(M, x-D, uniq); int k = find(M, x+D, uniq); if(i != -1 && k != -1){ ans += freqL[i]* freqR[k]; } freqL[idR]++; } printf("%lld", ans); return 0; }