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 = 3e5 + 5;
long long int n, d, A0[MAXN], A1[MAXN], A2[MAXN], tmp[MAXN], sz, dp[MAXN];
pair<long long int, long long int> tree[4 * MAXN];
pair<long long int, long long int> max(pair<long long int, long long int> a,
                                       pair<long long int, long long int> b) {
  if (a.first < b.first) return b;
  return a;
}
pair<long long int, long long int> qry(long long int node, long long int l,
                                       long long int r, long long int ql,
                                       long long int qr) {
  if (qr < l || r < ql) {
    return pair<long long int, long long int>();
  } else if (ql <= l && r <= qr) {
    return tree[node];
  } else {
    long long int m = (l + r) / 2;
    pair<long long int, long long int> t1 = qry(2 * node, l, m, ql, qr);
    pair<long long int, long long int> t2 = qry(2 * node + 1, m + 1, r, ql, qr);
    return max(t1, t2);
  }
}
void upd(long long int node, long long int l, long long int r, long long int x,
         long long int v, long long int i) {
  if (l == r) {
    tree[node] = {v, i};
  } else {
    long long int m = (l + r) / 2;
    if (l <= x && x <= m) upd(2 * node, l, m, x, v, i);
    if (m < x && x <= r) upd(2 * node + 1, m + 1, r, x, v, i);
    tree[node] = max(tree[2 * node], tree[2 * node + 1]);
  }
}
pair<long long int, long long int> qry(long long int l, long long int r) {
  return qry(1, 1, 3 * n, l, r);
}
void upd(long long int x, long long int v, long long int i) {
  upd(1, 1, 3 * n, x, v, i);
}
int main() {
  ios_base::sync_with_stdio(NULL);
  cin.tie();
  cout.tie();
  cin >> n >> d;
  for (int i = 1; i <= n; i++) {
    cin >> A1[i];
    tmp[sz++] = A1[i];
    A0[i] = A1[i] - d;
    tmp[sz++] = A0[i];
    A2[i] = A1[i] + d;
    tmp[sz++] = A2[i];
  }
  sort(tmp, tmp + sz);
  sz = unique(tmp, tmp + sz) - tmp;
  for (int i = 1; i <= n; i++) {
    A0[i] = (lower_bound(tmp, tmp + sz, A0[i]) - tmp) + 1;
    A1[i] = (lower_bound(tmp, tmp + sz, A1[i]) - tmp) + 1;
    A2[i] = (lower_bound(tmp, tmp + sz, A2[i]) - tmp) + 1;
  }
  for (int i = n; i >= 1; i--) {
    pair<long long int, long long int> t1 = qry(1, A0[i]);
    pair<long long int, long long int> t2 = qry(A2[i], 3 * n);
    if (t1.first < t2.first) swap(t1, t2);
    upd(A1[i], t1.first + 1, i);
    dp[i] = t1.second;
  }
  pair<long long int, long long int> ans = qry(1, 3 * n);
  cout << ans.first << '\n';
  long long int curr = ans.second;
  while (curr) {
    cout << curr << " ";
    curr = dp[curr];
  }
  cout << '\n';
}
