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;
struct Tree {
  long long l, r;
  int mx, id;
  Tree *ls, *rs;
  Tree() {}
  Tree(long long l, long long r) : l(l), r(r) {
    mx = 0;
    id = -1;
    ls = rs = NULL;
  }
  void update(long long p, int v, int d) {
    if (l == r) {
      mx = v;
      id = d;
      return;
    }
    long long m = l + r >> 1;
    if (p <= m) {
      if (ls == NULL) ls = new Tree(l, m);
      ls->update(p, v, d);
    } else {
      if (rs == NULL) rs = new Tree(m + 1, r);
      rs->update(p, v, d);
    }
    mx = 0;
    id = -1;
    if (ls && ls->mx > mx) {
      mx = ls->mx, id = ls->id;
    }
    if (rs && rs->mx > mx) {
      mx = rs->mx, id = rs->id;
    }
  }
  pair<int, int> query(long long L, long long R) {
    if (L <= l && r <= R) return pair<int, int>(mx, id);
    long long m = l + r >> 1;
    pair<int, int> ans(0, -1);
    if (L <= m) {
      if (ls != NULL) {
        pair<int, int> la = ls->query(L, R);
        if (la.first > ans.first) {
          ans = la;
        }
      }
    }
    if (R > m) {
      if (rs != NULL) {
        pair<int, int> ra = rs->query(L, R);
        if (ra.first > ans.first) {
          ans = ra;
        }
      }
    }
    return ans;
  }
  ~Tree() {
    if (ls) delete ls;
    if (rs) delete rs;
  }
};
const int MAX_N = 101010;
long long h[MAX_N];
int ind[MAX_N], val[MAX_N];
int main() {
  int n, d;
  while (scanf("%d%d", &n, &d) == 2) {
    memset(ind, -1, sizeof(ind));
    int ans = 0;
    long long mxh = 1;
    for (int i = 0; i < n; i++) {
      scanf("%I64d", &h[i]);
      mxh = max(mxh, h[i]);
    }
    mxh += d + 10;
    Tree* lx = new Tree(1, mxh);
    for (int i = 0; i < n; i++) {
      long long down = h[i] - d;
      pair<int, int> dp(0, -1);
      if (down >= 1) {
        pair<int, int> t = lx->query(1, down);
        if (t.first > dp.first) {
          dp = t;
          ind[i] = dp.second;
        }
      }
      long long up = h[i] + d;
      pair<int, int> t = lx->query(up, mxh);
      if (t.first > dp.first) {
        dp = t;
        ind[i] = dp.second;
      }
      lx->update(h[i], dp.first + 1, i);
      val[i] = dp.first + 1;
    }
    int w = 0;
    for (int i = 0; i < n; i++)
      if (val[i] > val[w]) w = i;
    printf("%d\n", val[w]);
    vector<int> vi;
    while (1) {
      vi.push_back(w);
      w = ind[w];
      if (w == -1) break;
    }
    reverse(vi.begin(), vi.end());
    for (int i = 0; i < vi.size(); i++) {
      printf("%d%c", vi[i] + 1, " \n"[i == vi.size() - 1]);
    }
  }
  return 0;
}
