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>
ostream& operator<<(ostream& os, vector<T> V) {
  os << "[ ";
  for (auto v : V) os << v << " ";
  return os << "]";
}
template <class T>
ostream& operator<<(ostream& os, set<T> S) {
  os << "{ ";
  for (auto s : S) os << s << " ";
  return os << "}";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
template <class L, class R>
ostream& operator<<(ostream& os, map<L, R> M) {
  os << "{ ";
  for (auto m : M) os << "(" << m.first << ":" << m.second << ")";
  return os << "}";
}
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cout << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cout.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const int N = 3e5 + 100;
map<long long, long long> cord;
long long A[N], d;
pair<long long, long long> mx[4 * N];
long long par[N];
void update(int i, int l, int r, long long x, long long val, long long id) {
  if (l > x || r < x) return;
  if (l == r) {
    mx[i].first = val;
    mx[i].second = id;
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    update(2 * i, l, mid, x, val, id);
  else
    update(2 * i + 1, mid + 1, r, x, val, id);
  mx[i] = max(mx[2 * i], mx[2 * i + 1]);
}
pair<long long, long long> query(int i, int l, int r, int L, int R) {
  if (r < L || l > R) return {0, 0};
  if (l >= L && r <= R) return mx[i];
  int mid = (l + r) >> 1;
  pair<long long, long long> left = query(2 * i, l, mid, L, R);
  pair<long long, long long> right = query(2 * i + 1, mid + 1, r, L, R);
  return max(left, right);
}
pair<long long, long long> getMax(int i, int l, int r) {
  if (l == r) return mx[i];
  int mid = (l + r) >> 1;
  return max(getMax(2 * i, l, mid), getMax(2 * i + 1, mid + 1, r));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cout << fixed << setprecision(25);
  long long n;
  cin >> n >> d;
  for (int i = 1; i <= n; ++i) {
    cin >> A[i];
    cord[A[i] - d];
    cord[A[i]];
    cord[A[i] + d];
  }
  int idx = 1;
  for (auto it : cord) {
    cord[it.first] = idx++;
  }
  idx--;
  for (int i = 1; i <= n; ++i) {
    pair<long long, long long> val = {0, 0};
    val = max(val, query(1, 1, idx, 1, cord[A[i] - d]));
    val = max(val, query(1, 1, idx, cord[A[i] + d], idx));
    pair<long long, long long> self = query(1, 1, idx, cord[A[i]], cord[A[i]]);
    if (self.first == val.first + 1) continue;
    par[i] = val.second;
    update(1, 1, idx, cord[A[i]], val.first + 1, i);
  }
  pair<long long, long long> mx = getMax(1, 1, idx);
  cout << mx.first << "\n";
  assert(mx.first != 0);
  vector<int> v;
  int u = mx.second;
  while (u != 0) {
    v.push_back(u);
    int v = u;
    u = par[u];
    if (u != 0) assert((abs(A[u] - A[v])) >= d);
  }
  reverse((v).begin(), (v).end());
  for (auto it : v) cout << it << ' ';
  return 0;
}
