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;
using ll = long long;
const int mn = 1e5 + 1;
ll n, d, a[mn], b[mn], ans = 1, cnt = 1, pos = 1, ansid[mn];
struct pairs {
  int val, id;
  pairs operator+(pairs A) { return (pairs){val + A.val, id + A.id}; }
} tree[mn * 4], f[mn];
pairs maxp(pairs A, pairs B) {
  if (A.val == B.val) {
    if (A.id > B.id) return A;
    return B;
  }
  if (A.val < B.val) return B;
  return A;
}
void update(int l, int r, int id, int x, pairs p) {
  if (l > x || x > r) return;
  if (l == r) {
    tree[id] = p;
    return;
  }
  int mid = (l + r) / 2;
  update(l, mid, id * 2, x, p);
  update(mid + 1, r, id * 2 + 1, x, p);
  tree[id] = maxp(tree[id * 2], tree[id * 2 + 1]);
}
pairs get(int l, int r, int id, int x, int y) {
  if (l > y || x > r) return (pairs){0, 0};
  if (x <= l && r <= y) return tree[id];
  int mid = (l + r) / 2;
  return maxp(get(l, mid, id * 2, x, y), get(mid + 1, r, id * 2 + 1, x, y));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> d;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    b[i] = a[i];
  }
  sort(b + 1, b + n + 1);
  for (int i = 1; i <= n; ++i) {
    int u = upper_bound(b + 1, b + n + 1, a[i] - d) - b - 1;
    int v = lower_bound(b + 1, b + n + 1, a[i] + d) - b;
    int k = lower_bound(b + 1, b + n + 1, a[i]) - b;
    if (u) f[i] = maxp(f[i], get(1, n, 1, 1, u) + (pairs){1, 0});
    if (v <= n) f[i] = maxp(f[i], get(1, n, 1, v, n) + (pairs){1, 0});
    f[i] = maxp(f[i], (pairs){1, i});
    update(1, n, 1, k, (pairs){f[i].val, i});
    if (ans < f[i].val) {
      ans = f[i].val;
      pos = i;
    }
  }
  cout << ans << "\n";
  ansid[ans] = pos, cnt = ans - 1;
  while (cnt) ansid[cnt--] = f[ansid[cnt + 1]].id;
  for (int i = 1; i <= ans; ++i) cout << ansid[i] << " ";
  cout << "\n";
  return 0;
}
