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;
int N;
long long D;
long long A[301000];
int B[301000];
int pre[301000];
struct node {
  long long v, pre;
};
node seg[301000 * 3];
inline void lazy_eval(int k) {
  if (seg[k * 2 + 1].v < seg[k].v) {
    seg[k * 2 + 1].v = seg[k].v;
    seg[k * 2 + 1].pre = seg[k].pre;
  }
  if (seg[k * 2 + 2].v < seg[k].v) {
    seg[k * 2 + 2].v = seg[k].v;
    seg[k * 2 + 2].pre = seg[k].pre;
  }
}
void update(int a, int b, long long x, int p, int k = 0, int l = 0, int r = N) {
  if (b <= l || r <= a) return;
  if (a <= l && r <= b) {
    if (seg[k].v < x) {
      seg[k].v = x;
      seg[k].pre = p;
    }
  } else {
    lazy_eval(k);
    int m = (l + r) / 2;
    update(a, b, x, p, k * 2 + 1, l, m);
    update(a, b, x, p, k * 2 + 2, m, r);
  }
}
pair<long long, int> get(int a, int k = 0, int l = 0, int r = N) {
  int b = a + 1;
  if (b <= l || r <= a) return make_pair(-(1 << 30), -(1 << 30));
  if (a <= l && r <= b) return make_pair(seg[k].v, seg[k].pre);
  lazy_eval(k);
  int m = (l + r) / 2;
  pair<long long, int> pl = get(a, k * 2 + 1, l, m);
  pair<long long, int> pr = get(a, k * 2 + 2, m, r);
  return max(pl, pr);
}
void show_seg() {
  for (int i = 0; i < N; i++) {
    cout << i << " " << get(i).first << " " << get(i).second << endl;
  }
}
int main() {
  scanf("%d%I64d", &N, &D);
  vector<pair<long long, int> > vec;
  for (int i = 0; i < N; i++) {
    scanf("%I64d", &A[i]);
    vec.push_back(make_pair(A[i], i));
  }
  sort(vec.begin(), vec.end());
  for (int i = 0; i < N; i++) {
    B[vec[i].second] = i;
  }
  int pmax = -(1 << 30), pat;
  for (int i = 0; i < N; i++) {
    pair<long long, int> p = get(B[i]);
    if (pmax < p.first) {
      pmax = p.first;
      pat = i;
    }
    pre[i] = p.second;
    if (i + 1 < N) {
      int lv =
          upper_bound(vec.begin(), vec.end(), make_pair(A[i] - D, (1 << 30))) -
          vec.begin();
      int rv =
          lower_bound(vec.begin(), vec.end(), make_pair(A[i] + D, -(1 << 30))) -
          vec.begin();
      update(0, lv, p.first + 1, i + 1);
      update(rv, N, p.first + 1, i + 1);
    }
  }
  vector<int> ans;
  int at = pat;
  while (at >= 0) {
    ans.push_back(at + 1);
    at = pre[at] - 1;
  }
  printf("%d\n", ans.size());
  for (int i = ans.size() - 1; i >= 0; i--) printf("%d ", ans[i]);
  printf("\n");
}
