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;
const long long maxn = 1e+5 + 100;
struct Tree {
  long long max, res;
};
long long n, D, rt, ans;
long long maxv[maxn * 60], resv[maxn * 60], ls[maxn * 60], rs[maxn * 60], cnt;
long long a[maxn], f[maxn];
map<long long, long long> la, id;
vector<long long> V;
void pushup(long long o) {
  if (maxv[ls[o]] > maxv[rs[o]]) {
    maxv[o] = maxv[ls[o]];
    resv[o] = resv[ls[o]];
  } else {
    maxv[o] = maxv[rs[o]];
    resv[o] = resv[rs[o]];
  }
}
void optadd(long long &o, long long l, long long r, long long q, long long v) {
  if (!o) o = ++cnt;
  if (l == r) {
    maxv[o] = v;
    resv[o] = l;
    return;
  }
  long long mid = l + r >> 1;
  if (q <= mid)
    optadd(ls[o], l, mid, q, v);
  else
    optadd(rs[o], mid + 1, r, q, v);
  pushup(o);
  return;
}
Tree querymax(long long &o, long long l, long long r, long long ql,
              long long qr) {
  Tree ret;
  ret.max = ret.res = 0;
  if (!o) return ret;
  if (ql <= l && r <= qr) {
    ret.max = maxv[o];
    ret.res = resv[o];
    return ret;
  }
  long long mid = l + r >> 1;
  if (ql <= mid) {
    Tree Ls = querymax(ls[o], l, mid, ql, qr);
    ret = Ls;
  }
  if (qr > mid) {
    Tree Rs = querymax(rs[o], mid + 1, r, ql, qr);
    if (Rs.max > ret.max) ret = Rs;
  }
  return ret;
}
signed main() {
  cin >> n >> D;
  f[1] = 1;
  for (register long long i = 1; i <= n; ++i) {
    cin >> a[i];
    Tree t =
        a[i] - D >= 1ll ? querymax(rt, 1, 1ll << 60, 1, a[i] - D) : Tree{0, 0};
    Tree s = querymax(rt, 1, 1ll << 60, a[i] + D, 1ull << 60);
    if (t.max > s.max) {
      f[i] = t.max + 1;
      la[i] = id[t.res];
    } else {
      f[i] = s.max + 1;
      la[i] = id[s.res];
    }
    optadd(rt, 1, 1ll << 60, a[i], f[i]);
    id[a[i]] = i;
    if (f[i] > f[ans]) ans = i;
  }
  printf("%d\n", f[ans]);
  for (register long long i = ans; i; i = la[i]) {
    V.push_back(i);
  }
  for (register long long i = V.size() - 1; i >= 0; --i) printf("%lld ", V[i]);
  return 0;
}
