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;
long long t[4000005];
long long f[1000005], a[1000005];
long long n, d;
vector<long long> mas;
void update(int v, int l, int r, int pos, long long val) {
  if (l == r) {
    t[v] = max(t[v], val);
    return;
  }
  int m = (l + r) / 2;
  if (pos <= m)
    update(v + v, l, m, pos, val);
  else
    update(v + v + 1, m + 1, r, pos, val);
  t[v] = max(t[v + v], t[v + v + 1]);
}
long long get(int v, int tl, int tr, int l, int r) {
  if (l > r) return 0;
  if (tl > r || tr < l) return 0;
  if (l <= tl && r >= tr) return t[v];
  int tm = (tl + tr) / 2;
  return max(get(v + v, tl, tm, l, r), get(v + v + 1, tm + 1, tr, l, r));
}
int main() {
  cin >> n >> d;
  for (int i = 1; i <= n; ++i) cin >> a[i], mas.push_back(a[i]), f[i] = 1;
  sort(mas.begin(), mas.end());
  mas.erase(unique((mas).begin(), (mas).end()), mas.end());
  int sz = mas.size() - 1;
  for (int i = 1; i <= n; ++i) {
    int low =
        upper_bound((mas).begin(), (mas).end(), a[i] - d) - mas.begin() - 1;
    int upper = lower_bound((mas).begin(), (mas).end(), a[i] + d) - mas.begin();
    int pos = lower_bound((mas).begin(), (mas).end(), a[i]) - mas.begin();
    f[i] = max(get(1, 0, sz, 0, low), get(1, 0, sz, upper, sz)) + 1;
    update(1, 0, sz, pos, f[i]);
  }
  long long mx = -1, pos;
  for (int i = 1; i <= n; ++i) {
    if (f[i] > mx) {
      mx = f[i];
      pos = i;
    }
  }
  cout << mx << endl;
  vector<long long> ans;
  ans.push_back(pos);
  int it = pos, k = mx - 1;
  for (int i = pos - 1; i >= 1; i--)
    if (f[i] == k && abs(a[it] - a[i]) >= d) {
      it = i;
      k--;
      ans.push_back(i);
    }
  for (int i = ans.size() - 1; i >= 0; --i) cout << ans[i] << ' ';
  return 0;
}
