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;
const int maxn = 1e5 + 10;
const long long inf = 1e15 + 1e10;
int last = 2;
pair<int, int> t[30 * 4 * maxn];
int vl[30 * 4 * maxn];
int vr[30 * 4 * maxn];
int p[maxn], ans[maxn];
long long a[maxn];
long long st, ed;
int dt, dt_id;
pair<int, int> res;
void upd(int v, long long l, long long r) {
  if (l >= ed || r <= st) return;
  if (l + 1 == r) {
    t[v] = max(t[v], {dt, dt_id});
    return;
  }
  if (vl[v] == 0) {
    vl[v] = last++;
  }
  if (vr[v] == 0) {
    vr[v] = last++;
  }
  upd(vl[v], l, (l + r) / 2);
  upd(vr[v], (l + r) / 2, r);
  t[v] = max(t[vl[v]], t[vr[v]]);
}
void get(int v, long long l, long long r) {
  if (v == 0 || l >= ed || r <= st) return;
  if (st <= l && r <= ed) {
    res = max(res, t[v]);
    return;
  }
  get(vl[v], l, (l + r) / 2);
  get(vr[v], (l + r) / 2, r);
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int n, d;
  cin >> n >> d;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  int best = 0;
  for (int i = 1; i <= n; i++) {
    res = {0, 0};
    st = -inf, ed = a[i] - d + 1;
    get(1, -inf, inf);
    st = a[i] + d, ed = inf;
    get(1, -inf, inf);
    ans[i] = res.first + 1;
    p[i] = res.second;
    if (ans[best] < ans[i]) {
      best = i;
    }
    st = a[i], ed = st + 1;
    dt = res.first + 1, dt_id = i;
    upd(1, -inf, inf);
  }
  cout << ans[best] << "\n";
  vector<int> path;
  while (best) {
    path.push_back(best);
    best = p[best];
  }
  reverse((path).begin(), (path).end());
  for (auto &el : path) {
    cout << el << " ";
  }
  cout << "\n";
  return 0;
}
