Marmot found a row with n pillars. The i-th pillar has the height of hi meters. Starting from one pillar i1, Marmot wants to jump on the pillars i2, ..., ik. (1 ≤ i1 < i2 < ... < ik ≤ n). From a pillar i Marmot can jump on a pillar j only if i < j and |hi - hj| ≥ d, where |x| is the absolute value of the number x.

Now Marmot is asking you find out a jump sequence with maximal length and print it.

Input

The first line contains two integers n and d (1 ≤ n ≤ 105, 0 ≤ d ≤ 109).

The second line contains n numbers h1, h2, ..., hn (1 ≤ hi ≤ 1015).

Output

The first line should contain one integer k, the maximal length of a jump sequence.

The second line should contain k integers i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ n), representing the pillars' indices from the maximal length jump sequence.

If there is more than one maximal length jump sequence, print any.

Examples

Input

5 2
1 3 6 7 4


Output

4
1 2 3 5 


Input

10 3
2 1 3 6 9 11 7 3 20 18


Output

6
1 4 6 7 8 9 

Note

In the first example Marmot chooses the pillars 1, 2, 3, 5 with the heights 1, 3, 6, 4. Another jump sequence of length 4 is 1, 2, 4, 5.
#include <bits/stdc++.h>
using namespace std;
long long int n, d, dp[100005], tree[100005 * 3], mx[100005 * 3], lol[100005],
    cnt[100005], an = 0, ans;
struct data {
  long long int val, p1, p2;
};
data a[100005];
bool cmp(const data &x, const data &y) {
  if (x.val < y.val)
    return true;
  else if (x.val == y.val && x.p1 < y.p1)
    return true;
  return false;
}
bool comp(const data &x, const data &y) {
  if (x.p1 < y.p1) return true;
  return false;
}
long long int binlo(long long int num) {
  long long int lo = 1, hi = n, mid, tmp = 0;
  while (lo <= hi) {
    mid = (lo + hi) >> 1;
    if (lol[mid] <= num - d)
      tmp = mid, lo = mid + 1;
    else
      hi = mid - 1;
  }
  return tmp;
}
long long int binup(long long int num) {
  long long int lo = 1, hi = n, mid, tmp = n + 1;
  while (lo <= hi) {
    mid = (lo + hi) >> 1;
    if (lol[mid] >= num + d)
      tmp = mid, hi = mid - 1;
    else
      lo = mid + 1;
  }
  return tmp;
}
long long int query(long long int node, long long int b, long long int e,
                    long long int i, long long int j) {
  if (i > e || j < b) return 0;
  if (b >= i && e <= j) return mx[node];
  long long int lef = node << 1, ri = (node << 1) + 1, mid = (b + e) >> 1, tmp,
                tpp;
  tmp = query(lef, b, mid, i, j), tpp = query(ri, mid + 1, e, i, j);
  if (cnt[tmp] > cnt[tpp])
    return tmp;
  else
    return tpp;
}
void update(long long int node, long long int b, long long int e,
            long long int i, long long int valu, long long int pos) {
  if (i > e || i < b)
    return;
  else if (b >= i && e <= i) {
    mx[node] = pos, tree[node] = valu;
    return;
  }
  long long int lef = node << 1, ri = (node << 1) + 1, mid = (b + e) >> 1;
  update(lef, b, mid, i, valu, pos), update(ri, mid + 1, e, i, valu, pos);
  if (tree[lef] > tree[ri] && tree[lef] > tree[node])
    tree[node] = tree[lef], mx[node] = mx[lef];
  else if (tree[lef] <= tree[ri] && tree[ri] > tree[node])
    tree[node] = tree[ri], mx[node] = mx[ri];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  scanf("%lld%lld", &n, &d);
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i].val), a[i].p1 = i;
  sort(a + 1, a + n + 1, cmp);
  for (int i = 1; i <= n; i++) a[i].p2 = i, lol[i] = a[i].val;
  sort(a + 1, a + n + 1, comp);
  for (long long int i = 1, lo, hi, tmp = 0, tpp = 0; i <= n;
       i++, tmp = 0, tpp = 0) {
    lo = binlo(a[i].val), hi = binup(a[i].val);
    if (lo >= 1) tmp = query(1, 1, n, 1, lo);
    if (hi <= n) tpp = query(1, 1, n, hi, n);
    if (cnt[tmp] < cnt[tpp]) swap(tmp, tpp);
    dp[i] = tmp, cnt[i] = cnt[tmp] + 1;
    if (an < cnt[tmp] + 1) an = cnt[tmp] + 1, ans = i;
    update(1, 1, n, a[i].p2, cnt[tmp] + 1, i);
  }
  printf("%lld\n", an);
  lol[an + 1] = -1;
  while (ans) {
    lol[an] = ans;
    an--;
    ans = dp[ans];
  }
  for (int i = 1; lol[i] != -1; i++) printf("%lld ", lol[i]);
  return 0;
}
