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;
inline long long int GCD(long long int x, long long int y) {
  if (x < y) swap(x, y);
  if (x == 0) return y;
  if (y == 0) return x;
  return GCD(x % y, y);
}
long long int phi(long long int n) {
  long long int result = n;
  for (long long int i = 2; i * i <= n; i++) {
    if (n % i == 0) {
      while (n % i == 0) n /= i;
      result -= result / i;
    }
  }
  if (n > 1) result -= result / n;
  return result;
}
long long int power(long long int x, long long int n, long long int mod) {
  long long int res = 1;
  x %= mod;
  while (n) {
    if (n & 1) {
      res = ((res * x) % mod + mod) % mod;
    }
    x = ((x * x) % mod + mod) % mod;
    n >>= 1;
  }
  return res;
}
const int MAXN = 1e5 + 5;
map<long long int, long long int> mapped;
long long int N, D;
long long int H[MAXN];
long long int Tree[4 * MAXN] = {0};
void update(long long int node, long long int start, long long int end,
            long long int l, long long int r, long long int val) {
  if (start > end || l > end || r < start) return;
  if (l <= start && end <= r) {
    Tree[node] = max(Tree[node], val);
    return;
  }
  long long int mid = (start + end) / 2;
  if (l <= mid) update(2 * node, start, mid, l, r, val);
  if (mid + 1 <= r) update(2 * node + 1, mid + 1, end, l, r, val);
  Tree[node] = max(Tree[2 * node], Tree[2 * node + 1]);
}
long long int query(long long int node, long long int start, long long int end,
                    long long int l, long long int r) {
  if (start > end || l > end || r < start) return 0;
  if (l <= start && end <= r) {
    return Tree[node];
  }
  long long int mid = (start + end) / 2;
  long long int left = 0, right = 0;
  if (l <= mid) left = query(2 * node, start, mid, l, r);
  if (mid + 1 <= r) right = query(2 * node + 1, mid + 1, end, l, r);
  return max(left, right);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> N >> D;
  for (long long int i = 1; i <= N; i++) {
    cin >> H[i];
    mapped[H[i]] = 0;
  }
  map<long long int, long long int>::iterator it;
  long long int cnt = 1;
  for (it = mapped.begin(); it != mapped.end(); it++) {
    it->second = cnt++;
  }
  vector<long long int> ans(N + 1, 0);
  long long int mx = -1, up, down;
  for (long long int i = 1; i <= N; i++) {
    it = mapped.lower_bound(H[i] + D);
    up = cnt;
    if (it != mapped.end()) up = it->second;
    it = mapped.upper_bound(H[i] - D);
    down = 0;
    if (it != mapped.end()) down = it->second - 1;
    ans[i] = max(query(1, 1, cnt, 1, down), query(1, 1, cnt, up, cnt)) + 1;
    update(1, 1, cnt, mapped[H[i]], mapped[H[i]], ans[i]);
    mx = max(ans[i], mx);
  }
  cout << mx << endl;
  long long int h = 1e18 + 9;
  vector<long long int> v;
  for (long long int i = N; i >= 1; i--) {
    if (abs(h - H[i]) >= D && mx == ans[i]) {
      v.push_back(i);
      mx--;
      h = H[i];
    }
  }
  reverse(v.begin(), v.end());
  for (long long int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
  }
  cout << endl;
  ;
}
