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 = 100007;
int n, cnt;
pair<int, int> bit1[maxn], bit2[maxn];
long long d, h[maxn], lh[maxn];
int toLeft[maxn], toRight[maxn], f[maxn], trace[maxn];
vector<int> ans;
void update_up(pair<int, int> *bit, int i, pair<int, int> v) {
  for (; i <= cnt; i += i & (-i)) bit[i] = max(bit[i], v);
}
void update_down(pair<int, int> *bit, int i, pair<int, int> v) {
  for (; i; i -= i & (-i)) bit[i] = max(bit[i], v);
}
pair<int, int> get_down(pair<int, int> *bit, int i) {
  pair<int, int> res = pair<int, int>(-1, -1);
  for (; i; i -= i & (-i)) res = max(res, bit[i]);
  return res;
}
pair<int, int> get_up(pair<int, int> *bit, int i) {
  pair<int, int> res = pair<int, int>(-1, -1);
  for (; i <= cnt; i += i & (-i)) res = max(res, bit[i]);
  return res;
}
int hpos(long long h) { return lower_bound(lh + 1, lh + cnt + 1, h) - lh; }
int main() {
  scanf("%d%I64d", &n, &d);
  for (int i = 1; i <= n; ++i) scanf("%I64d", &h[i]), lh[i] = h[i];
  sort(lh + 1, lh + n + 1);
  cnt = unique(lh + 1, lh + n + 1) - (lh + 1);
  for (int i = 1, j = 1; i <= cnt; ++i) {
    while (j <= i && lh[i] - lh[j] >= d) ++j;
    toLeft[i] = j - 1;
  }
  for (int i = cnt, j = cnt; i >= 1; --i) {
    while (j >= i && lh[j] - lh[i] >= d) --j;
    toRight[i] = j + 1;
  }
  for (int i = 1; i <= cnt; ++i) bit1[i] = bit2[i] = pair<int, int>(-1, -1);
  for (int i = 1; i <= n; ++i) {
    f[i] = 1;
    trace[i] = -1;
    int x = hpos(h[i]);
    pair<int, int> t = get_down(bit1, toLeft[x]);
    if (t.first + 1 > f[i]) {
      f[i] = t.first + 1;
      trace[i] = t.second;
    }
    t = get_up(bit2, toRight[x]);
    if (t.first + 1 > f[i]) {
      f[i] = t.first + 1;
      trace[i] = t.second;
    }
    if (f[i] > 0) {
      update_up(bit1, x, pair<int, int>(f[i], i));
      update_down(bit2, x, pair<int, int>(f[i], i));
    }
  }
  int u = 1, res = 1;
  for (int i = 2; i <= n; ++i)
    if (f[i] > res) {
      res = f[i];
      u = i;
    }
  printf("%d\n", res);
  while (u != -1) {
    ans.push_back(u);
    u = trace[u];
  }
  for (int i = int(ans.size()) - 1; i >= 0; --i) printf("%d ", ans[i]);
  return 0;
}
