#include <stdio.h>
#include 
<algorithm>
#include 
<string.h>
using namespace std;
struct point{
    
int x,y;
}
p[100010];
int c[100010],n,d,a[100010],map[100010],t;
bool cmp(point p0,point p1){
    
return p0.x<p1.x;
}

int lowbit(int x){
    
return x&(-x);
}

int sum(int x){
    
int s=0;
    
while(x){
        s
=(s+c[x])%9901;
        x
-=lowbit(x);
    }

    
return s;
}

int update(int x,int y){
    
while(x<=n){
        c[x]
=(c[x]+y)%9901;
        x
+=lowbit(x);
    }

}

int find(int x,bool y){
    
int l=1,r=n,m,ans=-1;
    
if(y){
        
while(l<=r){
            m
=(l+r)>>1;
            
if(p[m].x>=x){
                ans
=m;
                r
=m-1;
            }

            
else l=m+1;
        }

    }
else{
        
while(l<=r){
            m
=(l+r)>>1;
            
if(p[m].x<=x){
                ans
=m;
                l
=m+1;
            }

            
else r=m-1;
        }

    }

    
return ans;
}

int main(){
    
while(scanf("%d%d",&n,&d)!=EOF){
        memset(c,
0,sizeof(c[0])*(n+1));
        
for(int i=1;i<=n;i++){
            scanf(
"%d",&a[i]);
            p[i].x
=a[i];
            p[i].y
=i;
        }

        sort(p
+1,p+n+1,cmp);
        
for(int i=1;i<=n;i++)map[p[i].y]=i;
        
for(int i=1;i<=n;i++){
            
int l=find(a[i]-d,1),r=find(a[i]+d,0);
            
if(l+1&&r+1&&l<=r){
                t
=(9901+sum(r)-sum(l-1)+1)%9901;//+1巧妙之处,用于标记是否被更新,答案再减去n即可 
                update(map[i],t);
            }

        }

        printf(
"%d\n",(9901*20+sum(n)-n)%9901);
    }

    
return 0;
}