#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;
}