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;
typedef struct Treap *ptreap;
const long long inf = 1ll << 60;
const long long N = 1e5 + 1;
long long n, d;
pair<long long, long long> ans[N];
pair<long long, long long> opt;
struct Treap {
  long long key;
  long long pri;
  pair<long long, long long> mxm;
  pair<long long, long long> val;
  ptreap l = NULL;
  ptreap r = NULL;
  Treap(long long key, long long pri, pair<long long, long long> val)
      : key(key), pri(pri), val(val) {}
} *root = NULL;
pair<long long, long long> val(ptreap &t) {
  return t ? t->val : pair<long long, long long>(0, 0);
}
pair<long long, long long> mxm(ptreap &t) {
  return t ? t->mxm : pair<long long, long long>(0, 0);
}
void upd(ptreap &t) {
  if (!t) {
    return;
  }
  t->mxm = max(max(mxm(t->l), mxm(t->r)), t->val);
}
void split(ptreap t, ptreap &l, ptreap &r, long long key) {
  if (!t) {
    l = r = NULL;
  } else if (key <= t->key) {
    split(t->l, l, t->l, key), r = t;
  } else {
    split(t->r, t->r, r, key), l = t;
  }
  upd(t);
}
void merge(ptreap &t, ptreap l, ptreap r) {
  if (!l || !r) {
    t = l ? l : r;
  } else if (l->pri > r->pri) {
    merge(l->r, l->r, r), t = l;
  } else {
    merge(r->l, l, r->l), t = r;
  }
  upd(t);
}
void insert(ptreap &t, ptreap it) {
  if (!t) {
    t = it;
  } else if (it->pri > t->pri) {
    split(t, it->l, it->r, it->key), t = it;
  } else {
    insert(it->key <= t->key ? t->l : t->r, it);
  }
  upd(t);
}
pair<long long, long long> low_cut(long long k) {
  ptreap t;
  split(root, t, root, k + 1);
  pair<long long, long long> res = mxm(t);
  merge(root, t, root);
  return res;
}
pair<long long, long long> high_cut(long long k) {
  ptreap t;
  split(root, root, t, k);
  pair<long long, long long> res = mxm(t);
  merge(root, root, t);
  return res;
}
void print_path(long long i) {
  if (i == 0) {
    return;
  }
  print_path(ans[i].second);
  cout << i << " ";
}
void input() { cin >> n >> d; }
void solve() {
  for (long long i = 1; i <= n; ++i) {
    long long key;
    cin >> key;
    long long pri = rand();
    long long ind = i;
    pair<long long, long long> mxm = max(low_cut(key - d), high_cut(key + d));
    ans[i] = mxm;
    mxm = {mxm.first + 1, i};
    opt = max(opt, mxm);
    ptreap it = new Treap(key, pri, mxm);
    insert(root, it);
  }
  cout << opt.first << "\n";
  print_path(opt.second);
  cout << "\n";
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  input();
  solve();
}
