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 long long MAX_N = 1e5 + 5, MOD = 1e9 + 7,
                inf = 1000000LL * 1000000LL * 1000000LL;
long long n, d, IND;
long long dp[MAX_N];
long long par[MAX_N];
long long h[MAX_N];
pair<long long, long long> Max[MAX_N << 2];
pair<long long, long long> Min[MAX_N << 2];
void merge(long long id) {
  if (Max[id << 1].first < Max[id << 1 | 1].first)
    Max[id] = Max[id << 1 | 1];
  else
    Max[id] = Max[id << 1];
  if (Min[id << 1].first < Min[id << 1 | 1].first)
    Min[id] = Min[id << 1];
  else
    Min[id] = Min[id << 1 | 1];
}
void upd(long long ind, long long s = 0, long long e = n + 1,
         long long id = 1) {
  if (e - s == 1) {
    if (Max[id].first < h[ind]) Max[id] = {h[ind], ind};
    if (h[ind] < Min[id].first) Min[id] = {h[ind], ind};
    return;
  }
  long long mid = e + s >> 1;
  if (dp[ind] < mid)
    upd(ind, s, mid, id << 1);
  else
    upd(ind, mid, e, id << 1 | 1);
  merge(id);
}
pair<long long, long long> get(long long ind, long long s = 0,
                               long long e = n + 1, long long id = 1) {
  if (e - s == 1)
    return {s, (d <= Max[id].first - h[ind] ? Max[id].second : Min[id].second)};
  long long mid = e + s >> 1;
  if (d <=
      max(Max[id << 1 | 1].first - h[ind], h[ind] - Min[id << 1 | 1].first))
    return get(ind, mid, e, id << 1 | 1);
  return get(ind, s, mid, id << 1);
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  for (long long i = 0; i < (MAX_N << 2); i++) {
    Max[i] = {-inf, 0};
    Min[i] = {inf, 0};
  }
  cin >> n >> d;
  for (long long i = 0; i < n; i++) cin >> h[i];
  dp[n] = 0;
  h[n] = inf;
  upd(n);
  for (long long i = n - 1; ~i; i--) {
    pair<long long, long long> tmp = get(i);
    dp[i] = 1 + tmp.first;
    par[i] = tmp.second;
    upd(i);
  }
  for (int i = 1; i < n; i++)
    if (dp[IND] < dp[i]) IND = i;
  cout << dp[IND] << "\n";
  long long ind = IND;
  while (ind != n) {
    cout << ind + 1 << " ";
    ind = par[ind];
  }
  return 0;
}
