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 + 10, inf = 0x3f3f3f3f;
const int Maxm = Maxn << 2;
int maxv[Maxm], p[Maxm];
long long a[Maxn], b[Maxn];
int f[Maxn], pre[Maxn];
int n, m, idcnt;
map<long long, int> id;
inline long long read() {
  long long s = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
  return s * w;
}
inline void push_up(int k) {
  if (maxv[k << 1] > maxv[k << 1 | 1])
    maxv[k] = maxv[k << 1], p[k] = p[k << 1];
  else
    maxv[k] = maxv[k << 1 | 1], p[k] = p[k << 1 | 1];
}
void modify(int k, int l, int r, int pos, int u, int v) {
  if (l == r) {
    maxv[k] = u, p[k] = v;
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid)
    modify(k << 1, l, mid, pos, u, v);
  else
    modify(k << 1 | 1, mid + 1, r, pos, u, v);
  push_up(k);
}
int query(int k, int l, int r, int x, int y, int &pos) {
  if (x <= l && r <= y) {
    pos = p[k];
    return maxv[k];
  }
  int mid = (l + r) >> 1, tot, cnt;
  int u, v;
  tot = cnt = 0;
  if (x <= mid) tot = query(k << 1, l, mid, x, y, u);
  if (mid < y) cnt = query(k << 1 | 1, mid + 1, r, x, y, v);
  if (tot > cnt) {
    pos = u;
    return tot;
  } else {
    pos = v;
    return cnt;
  }
}
void calc(int i, int &x, int &y) {
  int l = 1, r = i;
  if (b[i] - b[l] < m) {
    x = 0;
    goto GG;
  }
  while (l < r) {
    int mid = (l + r) >> 1;
    ++mid;
    if (b[i] - b[mid] < m)
      r = mid - 1;
    else
      l = mid;
  }
  x = l;
GG:
  l = i, r = idcnt;
  if (b[r] - b[i] < m) {
    y = 0;
    goto FF;
  }
  while (l < r) {
    int mid = (l + r) >> 1;
    if (b[mid] - b[i] < m)
      l = mid + 1;
    else
      r = mid;
  }
  y = l;
FF:;
}
void dfs(int x) {
  if (pre[x]) dfs(pre[x]);
  printf("%d ", x);
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= n; ++i) a[i] = b[i] = read();
  sort(b + 1, b + 1 + n);
  for (int i = 1; i <= n; ++i) {
    b[++idcnt] = b[i];
    id[b[idcnt]] = idcnt;
    int j = i + 1;
    while (j <= n && b[i] == b[j]) ++j;
    i = j - 1;
  }
  for (int i = 1; i <= n; ++i) {
    int x, y, pos;
    calc(id[a[i]], x, y);
    f[i] = 1;
    if (x) {
      int tmp = query(1, 1, idcnt, 1, x, pos);
      if (tmp + 1 > f[i]) f[i] = tmp + 1, pre[i] = pos;
    }
    if (y) {
      int tmp = query(1, 1, idcnt, y, idcnt, pos);
      if (tmp + 1 > f[i]) f[i] = tmp + 1, pre[i] = pos;
    }
    modify(1, 1, idcnt, id[a[i]], f[i], i);
  }
  int ans = -1, pos;
  for (int i = 1; i <= n; ++i)
    if (f[i] > ans) ans = f[i], pos = i;
  printf("%d\n", ans);
  dfs(pos);
  putchar('\n');
  return 0;
}
