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;
template <class T>
struct Seg {
  const T ID = {0, -1};
  T comb(T a, T b) { return a.first >= b.first ? a : b; }
  int n;
  vector<T> seg;
  Seg(int _n) {
    n = _n;
    seg.resize(2 * n, ID);
  }
  void pull(int p) { seg[p] = comb(seg[2 * p], seg[2 * p + 1]); }
  void upd(int p, T value) {
    p += n;
    seg[p] = comb(seg[p], value);
    for (p /= 2; p; p /= 2) pull(p);
  }
  T query(int l, int r) {
    T ra = ID, rb = ID;
    for (l += n, r += n + 1; l < r; l /= 2, r /= 2) {
      if (l & 1) ra = comb(ra, seg[l++]);
      if (r & 1) rb = comb(seg[--r], rb);
    }
    return comb(ra, rb);
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, d;
  cin >> n >> d;
  vector<long long> h(n);
  for (long long &i : h) cin >> i;
  auto coordinate_compress = [d](vector<long long> h) {
    map<long long, int> compressed;
    for (long long i : h)
      compressed[i]++, compressed[i + d]++, compressed[i - d]++;
    int rank = 0;
    for (pair<const long long, int> &p : compressed) p.second = rank++;
    return compressed;
  };
  map<long long, int> compressed = coordinate_compress(h);
  vector<int> dp(n, 0);
  vector<int> from(n, 0);
  int N = compressed.size() + 1;
  Seg<pair<int, int>> seg_tree(N);
  for (int i = 0; i < n; i++) {
    pair<int, int> l = seg_tree.query(0, compressed[h[i] - d]);
    pair<int, int> r = seg_tree.query(compressed[h[i] + d], N - 1);
    if (l.first > r.first) {
      dp[i] = l.first + 1;
      from[i] = l.second;
    } else {
      dp[i] = r.first + 1;
      from[i] = r.second;
    }
    seg_tree.upd(compressed[h[i]], {dp[i], i});
  }
  int mx_idx = 0;
  for (int i = 1; i < n; i++) {
    if (dp[i] > dp[mx_idx]) mx_idx = i;
  }
  vector<int> ans;
  while (mx_idx != -1) ans.push_back(mx_idx), mx_idx = from[mx_idx];
  reverse(ans.begin(), ans.end());
  cout << ans.size() << "\n";
  for (int i : ans) cout << i + 1 << " ";
  cout << endl;
  return 0;
}
