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 N = 1e5 + 10, SN = 4e5 + 10;
long long H[N], d;
int ans[SN], l[SN], r[SN], h[N], dp[N], n, ind[SN], par[N];
vector<long long> v;
vector<int> a;
int comped(long long x) {
  vector<long long>::iterator it = lower_bound(v.begin(), v.end(), x);
  return ((int)(it - v.begin()));
}
void make(int v, int sl, int sr) {
  l[v] = sl;
  r[v] = sr;
  ind[v] = -1;
  if (sr - sl == 1) return;
  int med = (sl + sr) / 2;
  make(2 * v, sl, med);
  make(2 * v + 1, med, sr);
}
void add(int v, int i, int val, int o) {
  ans[v] = max(ans[v], val);
  if (ans[v] == val) ind[v] = o;
  if (r[v] - l[v] == 1) return;
  int med = (l[v] + r[v]) / 2;
  if (i < med)
    add(2 * v, i, val, o);
  else
    add(2 * v + 1, i, val, o);
}
int get(int v, int ql, int qr) {
  if (ql >= r[v] || qr <= l[v]) return -1;
  if (ql <= l[v] && r[v] <= qr) {
    return ind[v];
  }
  int ind1 = get(2 * v, ql, qr), ind2 = get(2 * v + 1, ql, qr);
  if (dp[ind1] > dp[ind2]) {
    return ind1;
  }
  return ind2;
}
void asgn(int i, int j) { dp[i] = dp[j] + 1, par[i] = j; }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> d;
  for (int i = 0; i < n; i++) {
    cin >> H[i];
    v.push_back(H[i]);
  }
  sort(v.begin(), v.end());
  v.resize(distance(v.begin(), unique(v.begin(), v.end())));
  for (int i = 0; i < n; i++) h[i] = comped(H[i]);
  make(1, 0, n);
  dp[0] = 1;
  add(1, h[0], 1, 0);
  par[0] = 0;
  for (int i = 1; i < n; i++) {
    int L, R, max1, max2;
    vector<long long>::iterator it = upper_bound(v.begin(), v.end(), H[i] - d);
    if (it == v.begin())
      max1 = -1;
    else {
      L = (int)(it - v.begin());
      max1 = get(1, 0, L);
    }
    it = lower_bound(v.begin(), v.end(), H[i] + d);
    if (it == v.end())
      max2 = -1;
    else {
      R = (int)(it - v.begin());
      max2 = get(1, R, n);
    }
    if (max1 == -1 && max2 == -1)
      par[i] = i, dp[i] = 1;
    else if (max1 == -1)
      asgn(i, max2);
    else if (max2 == -1)
      asgn(i, max1);
    else if (dp[max1] > dp[max2])
      asgn(i, max1);
    else
      asgn(i, max2);
    add(1, h[i], dp[i], i);
  }
  int mind = 0, t;
  for (int i = 0; i < n; i++)
    if (dp[mind] < dp[i]) mind = i;
  t = mind;
  cout << dp[mind] << '\n';
  while (dp[mind] > 0) {
    a.push_back(t);
    t = par[t];
    dp[mind]--;
  }
  sort(a.begin(), a.end());
  for (int i : a) cout << i + 1 << ' ';
}
