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, N, M;
set<long long> S;
map<long long, long long> Map;
long long dp[100005], W[100005];
long long A[100005], ST[400005];
void indirge() {
  long long B[100005] = {0};
  for (int i = 1; i <= N; i++) B[i] = A[i];
  sort(B + 1, B + N + 1);
  for (int i = 1; i <= N; i++) Map[B[i]] = (n += (!i or B[i] != B[i - 1]));
}
long long query(int node, int bas, int son, int x, int y) {
  if (x > son or y < bas) return 0;
  if (x <= bas and son <= y) return ST[node];
  int md = (bas + son) >> 1;
  long long l = query(2 * node, bas, md, x, y);
  long long r = query(2 * node + 1, md + 1, son, x, y);
  if (dp[l] >= dp[r])
    return l;
  else
    return r;
}
void update(int node, int bas, int son, int x, long long val) {
  if (x > son or x < bas) return;
  if (x <= bas and son <= x) {
    ST[node] = val;
    return;
  }
  int md = (bas + son) >> 1;
  update(2 * node, bas, md, x, val);
  update(2 * node + 1, md + 1, son, x, val);
  long long le = ST[2 * node], ri = ST[2 * node + 1];
  if (dp[le] >= dp[ri])
    ST[node] = le;
  else
    ST[node] = ri;
}
void print(int nd) {
  if (W[nd]) print(W[nd]);
  printf("%d ", nd);
}
int main() {
  int x, y, t;
  scanf("%d %d", &N, &M);
  for (int i = 1; i <= N; i++) scanf("%lld", &A[i]);
  indirge();
  for (int i = 1; i <= N; i++) {
    set<long long>::iterator it = S.upper_bound(A[i] - M);
    if (it != S.begin()) {
      it--;
      t = query(1, 1, n, 1, Map[*it]);
      dp[i] = dp[t];
      W[i] = t;
    }
    it = S.lower_bound(A[i] + M);
    if (it != S.end()) {
      t = query(1, 1, n, Map[*it], n);
      if (dp[t] >= dp[i]) {
        dp[i] = dp[t];
        W[i] = t;
      }
    }
    dp[i]++;
    update(1, 1, n, Map[A[i]], i);
    S.insert(A[i]);
  }
  int ind = 1;
  for (int i = 1; i <= N; i++)
    if (dp[i] >= dp[ind]) ind = i;
  printf("%lld\n", dp[ind]);
  print(ind);
  return 0;
}
