/*<br />這題是憑著感覺寫的<br />*/<br />#include <iostream><br />#include <cstdio><br />#include <algorithm><br />#define LL(x) ((x) << 1)<br />#define RR(x) ((x) << 1 | 1)<br />using namespace std;<br />const int N = 100005;<br />const int mod = 9901;<br />struct Seg_tree{<br />int l, r, sum;<br />int mid(){<br />return (l + r) >> 1;<br />}<br />}tree[3 * N];<br />int pos[N];<br />int df1[N];<br />int df2[N];<br />inline void Build(int l, int r, int node){<br />tree[node].l = l;<br />tree[node].r = r;<br />tree[node].sum = 0;<br />if(l == r)<br />return;<br />int mid = (l + r) >> 1;<br />Build(l ,mid, LL(node));<br />Build(mid + 1, r, RR(node));<br />}<br />bool readint(int &ret){<br />int sgn;<br />char c;<br />c = getchar();<br />if(c == EOF)return true;<br />while( c != '-' && c < '0' || c > '9' )c = getchar();<br />sgn = (c == '-') ?-1 : 1;<br />ret = (c == '-') ? 0 :(c-'0');<br />while((c = getchar()) >= '0' && c <= '9')ret = ret * 10+ ( c - '0');<br />ret *= sgn;<br />return false;<br />}<br />inline void Update(int dx, int node, int sum){<br />/*<br />if(l <= tree[node].l && tree[node].r <= r){<br />tree[node].sum = (tree[node].sum + sum) % mod;<br />return ;<br />}<br />int mid = tree[node].mid();<br />if(r <= mid){<br />Update(l, r, LL(node), sum);<br />} else if(l > mid){<br />Update(l, r, RR(node), sum);<br />} else {<br />Update(l ,mid, LL(node), sum);<br />Update(mid + 1, r, RR(node), sum);<br />}<br />*/<br />tree[node].sum = (tree[node].sum + sum) % mod;<br />if(tree[node].l == tree[node].r){<br />return ;<br />}<br />int mid = tree[node].mid();<br />if(dx <= mid)<br />Update(dx, LL(node), sum);<br />else<br />Update(dx, RR(node), sum);<br />//tree[node].sum = (tree[LL(node)].sum + tree[RR(node)].sum) % mod;<br />}<br />inline int Query(int l, int r, int node){<br />//puts("Query");<br />if(l <= tree[node].l && tree[node].r <= r){<br />return tree[node].sum;<br />}<br />int mid = tree[node].mid();<br />if(r <= mid){<br />return Query(l, r, LL(node));<br />} else if(l > mid){<br />return Query(l, r, RR(node));<br />} else{<br />return Query(l, mid, LL(node)) + Query(mid + 1, r, RR(node));<br />}</p><p>}<br />inline int Bin(int x, int len){<br />int low = 0;<br />int high = len - 1;<br />while(low <= high){<br />int mid = (low + high) >> 1;<br />if(pos[mid] == x) return mid;<br />if(pos[mid] < x){<br />low = mid + 1;<br />} else{<br />high = mid - 1;<br />}<br />}<br />return -1;<br />}<br />inline int Bin1(int x, int len){ // 找>= x的最小下標<br />int ans = -1;<br />int low = 0;<br />int high = len - 1;<br />while(low <= high){<br />int mid = (low + high) >> 1;<br />if(pos[mid] >= x){<br />high = mid - 1;</p><p>} else{<br />low = mid + 1;<br />ans = mid + 1;<br />}<br />}<br />return ans;<br />}<br />inline int Bin2(int x, int len){// 找<= x的最大下標<br />int ans = -1;<br />int low = 0;<br />int high = len - 1;<br />while(low <= high){<br />int mid = (low + high) >> 1;<br />if(pos[mid] <= x){<br />low = mid + 1;<br />ans = mid;<br />} else{<br />high = mid - 1;<br />}<br />}<br />return ans;<br />}<br />int main(){<br />int n, dd;<br />while(scanf("%d %d", &n, &dd) != EOF){<br />for(int i = 0; i < n; i++){<br />//scanf("%d", &df1[i]);<br />readint(df1[i]);<br />df2[i] = df1[i];<br />}<br />sort(df1, df1 + n);<br />int len = 0;<br />for(int i = 0; i < n; i++){<br />if(i == 0 || df1[i] != df1[i - 1])<br />pos[len++] = df1[i];<br />}<br />//printf("len :: %d/n", len);<br />int last = 0;<br />Build(0, len - 1, 1);<br />//puts("Build");<br />for(int i = 0; i < n; i++){<br />//printf("df2[i] :: %d/n", df2[i]);<br />int l = Bin1((df2[i] - dd), len);<br />int r = Bin2((df2[i] + dd), len);</p><p>if(l == -1)<br />l = 0;<br />if(r == -1)<br />r = len - 1;<br />//printf("l :: %d r :: %d/n", l, r);<br />int sum = Query(l, r, 1);<br />//printf("sum :: %d/n", sum);<br />last = (last + sum) % mod;<br />Update(Bin(df2[i], len), 1 , 1 + sum);<br />}<br />printf("%d/n", last);<br />}<br />}