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