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;
clock_t time_p = clock();
void time_taken() {
  time_p = clock() - time_p;
  cerr << "Time Taken : " << (float)(time_p) / CLOCKS_PER_SEC << "\n";
}
const long long mod = 1e9 + 7;
const long long INF = 1e18;
const int maxn = 3e5 + 5;
vector<pair<int, int> > st(4 * maxn);
void upd(int v, int l, int r, int pos, int val) {
  if (pos < l or pos > r) return;
  if (pos == l and pos == r) {
    st[v] = {val, -l};
    return;
  }
  int mid = (l + r) >> 1;
  upd(2 * v, l, mid, pos, val);
  upd(2 * v + 1, mid + 1, r, pos, val);
  st[v] = max(st[2 * v], st[2 * v + 1]);
}
pair<int, int> qry(int v, int l, int r, int ql, int qr) {
  if (qr < l or ql > r) return {-mod, -mod};
  if (l >= ql and r <= qr) {
    return st[v];
  }
  int mid = (l + r) >> 1;
  return max(qry(2 * v, l, mid, ql, qr), qry(2 * v + 1, mid + 1, r, ql, qr));
}
template <typename Arg1, typename Arg2>
ostream& operator<<(ostream& out, const pair<Arg1, Arg2>& x) {
  return out << "(" << x.first << "," << x.second << ")";
}
template <typename Arg1>
ostream& operator<<(ostream& out, const vector<Arg1>& a) {
  out << "[";
  for (const auto& x : a) out << x << ",";
  return out << "]";
}
template <typename Arg1>
ostream& operator<<(ostream& out, const set<Arg1>& a) {
  out << "[";
  for (const auto& x : a) out << x << ",";
  return out << "]";
}
template <typename Arg1, typename Arg2>
ostream& operator<<(ostream& out, const map<Arg1, Arg2>& a) {
  out << "[";
  for (const auto& x : a) out << x << ",";
  return out << "]";
}
template <typename Arg1>
void __trace__(const string name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << " ] " << endl;
}
template <typename Arg1, typename... Args>
void __trace__(const string names, Arg1&& arg1, Args&&... args) {
  const string name = names.substr(0, names.find(','));
  cerr << name << " : " << arg1 << " | ";
  __trace__(names.substr(1 + (int)name.size()), args...);
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(nullptr);
  int n, d;
  cin >> n >> d;
  vector<long long> h(n);
  vector<long long> v;
  for (int i = 0; i < n; i++) {
    cin >> h[i];
    v.push_back(h[i] - d);
    v.push_back(h[i]);
    v.push_back(h[i] + d);
  }
  sort((v).begin(), (v).end());
  v.erase(unique((v).begin(), (v).end()), v.end());
  int m = (int)(v).size();
  vector<int> nxt(n), dp(n);
  vector<int> last(m, -1);
  for (int i = n - 1; i >= 0; i--) {
    int ind1 = lower_bound((v).begin(), (v).end(), h[i]) - v.begin();
    int ind2 = lower_bound((v).begin(), (v).end(), h[i] - d) - v.begin();
    int ind3 = lower_bound((v).begin(), (v).end(), h[i] + d) - v.begin();
    auto pp1 = qry(1, 0, m - 1, 0, ind2);
    auto pp2 = qry(1, 0, m - 1, ind3, m - 1);
    auto pp = max(pp1, pp2);
    dp[i] = 1 + pp.first;
    pp.second *= -1;
    if (pp.first == 0 or last[pp.second] == -1) {
      nxt[i] = n;
    } else {
      nxt[i] = last[pp.second];
    }
    last[ind1] = i;
    upd(1, 0, m - 1, ind1, dp[i]);
  }
  int ind = max_element((dp).begin(), (dp).end()) - dp.begin();
  vector<int> ans;
  while (ind < n) {
    ans.push_back(ind + 1);
    ind = nxt[ind];
  }
  cout << (int)(ans).size() << endl;
  for (int x : ans) cout << x << ' ';
  cout << endl;
  time_taken();
  return 0;
}
