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 int maxn = 100000, maxne = 1 << 18;
int n;
long long d, h[maxn + 1];
int mat[maxn + 1], _mat[maxn + 1];
struct node {
  int l, r, max_v, max_n;
} ne[maxne];
int f[maxn + 1];
void build() {
  for (int i = maxne - 1; i >= maxne >> 1; i--)
    ne[i].l = ne[i].r = i - (maxne >> 1) + 1, ne[i].max_v = ne[i].max_n = 0;
  for (int i = (maxne >> 1) - 1; i >= 1; i--)
    ne[i].l = ne[i << 1].l, ne[i].r = ne[(i << 1) + 1].r,
    ne[i].max_v = ne[i].max_n = 0;
}
void change(int pre, int x, int k) {
  if (ne[pre].l > x || x > ne[pre].r) return;
  if (ne[pre].max_v < k) {
    ne[pre].max_v = k;
    ne[pre].max_n = x;
  }
  if (ne[pre].l == x && x == ne[pre].r) return;
  change(pre << 1, x, k);
  change((pre << 1) + 1, x, k);
}
pair<int, int> search(int pre, int l, int r) {
  if (ne[pre].l > r || l > ne[pre].r) return make_pair(0, 0);
  if (l <= ne[pre].l && ne[pre].r <= r)
    return make_pair(ne[pre].max_v, ne[pre].max_n);
  pair<int, int> lc = search(pre << 1, l, r), rc = search((pre << 1) + 1, l, r);
  return lc.first > rc.first ? lc : rc;
}
bool cmp(const int x, const int y) { return h[x] < h[y]; }
stack<int> ans_sta;
int main() {
  scanf("%d%I64d", &n, &d);
  for (int i = 1; i <= n; i++) scanf("%I64d", &h[i]);
  for (int i = 1; i <= n; i++) mat[i] = i;
  sort(mat + 1, mat + n + 1, cmp);
  for (int i = 1; i <= n; i++) _mat[mat[i]] = i;
  build();
  memset(f, 0, sizeof f);
  for (int i = 1; i <= n; i++) {
    pair<int, int> lp, rp;
    int l = 1, r = _mat[i];
    for (int mid; l <= r;
         mid = l + r >> 1, h[mat[mid]] > h[i] - d ? r = mid - 1 : l = mid + 1)
      ;
    lp = search(1, 1, r);
    l = _mat[i], r = n;
    for (int mid; l <= r;
         mid = l + r >> 1, h[mat[mid]] >= h[i] + d ? r = mid - 1 : l = mid + 1)
      ;
    rp = search(1, l, n);
    if (lp.first > rp.first) {
      change(1, _mat[i], lp.first + 1);
      f[i] = mat[lp.second];
    } else {
      change(1, _mat[i], rp.first + 1);
      f[i] = mat[rp.second];
    }
  }
  printf("%d\n", search(1, 1, n).first);
  for (int i = mat[search(1, 1, n).second]; i > 0; i = f[i]) ans_sta.push(i);
  for (; !ans_sta.empty(); ans_sta.pop()) printf("%d ", ans_sta.top());
  printf("\n");
  return 0;
}
