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;
template <class T>
inline void read(T &x) {
  char ch = getchar();
  int f = 1;
  while ((ch != '-') && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-')
    f = 0, x = 0;
  else
    x = ch - 48;
  ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - 48, ch = getchar();
  if (!f) x = -x;
}
template <class T>
inline void read(T &x, T &y) {
  read(x);
  read(y);
}
template <class T>
inline void read(T &x, T &y, T &z) {
  read(x);
  read(y);
  read(z);
}
template <class T>
inline void read(T &x, T &y, T &z, T &o) {
  read(x);
  read(y);
  read(z);
  read(o);
}
int _t[20];
template <class T>
inline void out(T x, int ln = 1) {
  if (!x)
    putchar('0');
  else {
    if (x < 0) putchar('-'), x = -x;
    for (_t[0] = 0; x; x /= 10) _t[++_t[0]] = x % 10;
    for (int i = (_t[0]); i >= (1); i--) putchar(_t[i] + 48);
  }
  if (ln) putchar('\n');
}
int seg[300010 << 2], pos[300010 << 2];
int f[300010], g[300010];
long long h[300010], bin[300010];
int a[300010], n, d;
void upd(int x) {
  if (seg[(x << 1)] > seg[(x << 1 | 1)]) {
    seg[x] = seg[(x << 1)];
    pos[x] = pos[(x << 1)];
  } else {
    seg[x] = seg[(x << 1 | 1)];
    pos[x] = pos[(x << 1 | 1)];
  }
}
pair<int, int> ask(int ql, int qr, int l, int r, int x) {
  if (ql > qr) return make_pair(0, 0);
  if (ql <= l && r <= qr) return make_pair(seg[x], pos[x]);
  pair<int, int> ret = make_pair(0, 0);
  int mid = (l + r) >> 1;
  if (ql <= mid) ret = max(ret, ask(ql, qr, l, mid, (x << 1)));
  if (mid < qr) ret = max(ret, ask(ql, qr, mid + 1, r, (x << 1 | 1)));
  return ret;
}
void modify(int p, int v, int k, int l, int r, int x) {
  if (l == r) {
    if (v > seg[x]) {
      seg[x] = v;
      pos[x] = k;
    }
    return;
  }
  int mid = (l + r) >> 1;
  if (p <= mid)
    modify(p, v, k, l, mid, (x << 1));
  else
    modify(p, v, k, mid + 1, r, (x << 1 | 1));
  upd(x);
}
int main() {
  read(n, d);
  int cnt = 0;
  for (int i = (1); i <= (n); i++)
    read(h[i]), bin[++cnt] = h[i], bin[++cnt] = h[i] + d, bin[++cnt] = h[i] - d;
  sort(bin + 1, bin + cnt + 1);
  cnt = unique(bin + 1, bin + cnt + 1) - bin - 1;
  for (int i = (1); i <= (n); i++)
    a[i] = lower_bound(bin + 1, bin + cnt + 1, h[i]) - bin;
  int a1 = 0, a2;
  for (int i = (n); i >= (1); i--) {
    int l = upper_bound(bin + 1, bin + cnt + 1, h[i] - d) - bin - 1;
    int r = lower_bound(bin + 1, bin + cnt + 1, h[i] + d) - bin;
    pair<int, int> t = max(ask(1, l, 1, cnt, 1), ask(r, cnt, 1, cnt, 1));
    f[i] = t.first + 1;
    g[i] = t.second;
    if (f[i] > a1) {
      a1 = f[i];
      a2 = i;
    }
    modify(a[i], f[i], i, 1, cnt, 1);
  }
  out(a1);
  printf("%d", a2);
  int x = g[a2];
  while (x) {
    printf(" %d", x);
    x = g[x];
  }
  return 0;
}
