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;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const long long N = 1e15 + 7;
const int inf = INT_MAX / 2;
const long long INF = LLONG_MAX / 3;
const int MOD = 1e9 + 7;
const double eps = 1e-6;
const string cars[] = {"🚗", "🚕", "🚙"};
struct Tree {
  struct Node {
    pair<long long, long long> val;
    long long tl, tr, pos;
    Node *l, *r;
    Node(long long tl, long long tr)
        : val(make_pair(0LL, 0LL)), tl(tl), tr(tr), l(nullptr), r(nullptr) {}
  };
  Node* root = new Node(1, N);
  pair<long long, long long> get(Node* u) {
    return (u ? u->val : make_pair(0LL, 0LL));
  }
  void update(Node* u) { u->val = max(get(u->l), get(u->r)); }
  void update(Node* u, long long pos, int val) {
    if (u->tl == u->tr) {
      u->val = {val, pos};
    } else {
      long long tm = (u->tl + u->tr) / 2;
      if (pos <= tm) {
        if (!u->l) {
          u->l = new Node(u->tl, tm);
        }
        update(u->l, pos, val);
      } else {
        if (!u->r) {
          u->r = new Node(tm + 1, u->tr);
        }
        update(u->r, pos, val);
      }
      update(u);
    }
  }
  void update(long long pos, int val) { update(root, pos, val); }
  pair<long long, long long> query(Node* u, long long l, long long r) {
    if (l > r || !u) {
      return {0, 0};
    } else if (u->tl == l && u->tr == r) {
      return u->val;
    } else {
      long long tm = (u->tl + u->tr) / 2;
      return max(query(u->l, l, min(r, tm)), query(u->r, max(l, tm + 1), r));
    }
  }
  pair<long long, long long> query(long long l, long long r) {
    return l > r ? make_pair(0LL, 0LL) : query(root, l, r);
  }
} tree;
signed main() {
  cout << fixed << setprecision(4);
  ios::sync_with_stdio(false);
  cin.tie();
  cout.tie();
  long long n, d;
  cin >> n >> d;
  vector<long long> a(n), p(n);
  unordered_map<long long, long long> l;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    auto t = max(tree.query(1, a[i] - d), tree.query(a[i] + d, N - 7));
    p[i] = l[t.second];
    tree.update(a[i], t.first + 1);
    l[a[i]] = i;
  }
  auto [s, x] = tree.query(1, N - 7);
  cout << s << "\n";
  vector<long long> v;
  x = l[x];
  for (int i = 0; i < s; i++, x = p[x]) {
    v.push_back(x + 1);
  }
  reverse(v.begin(), v.end());
  for (int x : v) {
    cout << x << " ";
  }
  return 0;
}
