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 long long int inf = 1e15;
const long long int mod = 1000000007;
const int infInt = 1e9;
const double PI = acos(-1.00);
const double eps = 1e-6;
long long int a[100010];
long long int p[100010];
int Val[100010];
int o[100010];
int st[400010], m;
map<long long int, long long int> Map;
map<long long int, long long int> RMap;
multiset<long long int> Set;
long long int n, d;
void build(int l = 1, int r = m, int i = 0) {
  if (l == r) {
    st[i] = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, i * 2 + 1);
  build(mid + 1, r, i * 2 + 2);
  int L = st[i * 2 + 1];
  int R = st[i * 2 + 2];
  st[i] = ((Val[L] >= Val[R]) ? (L) : (R));
}
void update(int pos, int val, int l = 1, int r = m, int i = 0) {
  if (pos < l or pos > r) return;
  if (l == r) {
    Val[l] = val;
    return;
  }
  int mid = (l + r) >> 1;
  update(pos, val, l, mid, i * 2 + 1);
  update(pos, val, mid + 1, r, i * 2 + 2);
  int L = st[i * 2 + 1];
  int R = st[i * 2 + 2];
  st[i] = ((Val[L] >= Val[R]) ? (L) : (R));
}
int query(int s, int e, int l = 1, int r = m, int i = 0) {
  if (s > r or l > e) return -1;
  if (s <= l and r <= e) return st[i];
  int mid = (l + r) >> 1;
  int L = query(s, e, l, mid, i * 2 + 1);
  int R = query(s, e, mid + 1, r, i * 2 + 2);
  if (L == -1) return R;
  if (R == -1) return L;
  return ((Val[L] >= Val[R]) ? (L) : (R));
}
int bin1(long long int val) {
  int ind = Map[val];
  int ini = 1, fin = ind;
  int ans = -1;
  while (ini <= fin) {
    int mid = (ini + fin) >> 1;
    long long int valMid = RMap[mid];
    if (abs(valMid - val) >= d) {
      ans = max(ans, mid);
      ini = mid + 1;
    } else {
      fin = mid - 1;
    }
  }
  return ans;
}
int bin2(long long int val) {
  int ind = Map[val];
  int ini = ind, fin = m;
  int ans = infInt;
  while (ini <= fin) {
    int mid = (ini + fin) >> 1;
    long long int valMid = RMap[mid];
    if (abs(valMid - val) >= d) {
      ans = min(ans, mid);
      fin = mid - 1;
    } else {
      ini = mid + 1;
    }
  }
  return ans;
}
void print(int u) {
  if (p[u] == u) {
    cout << u << "\n";
    return;
  }
  cout << u << " ";
  print(p[u]);
}
int main() {
  cin.sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> d;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    Set.insert(a[i]);
  }
  int cont = 1;
  for (auto i : Set) {
    Map[i] = cont;
    RMap[cont] = i;
    cont++;
  }
  m = Set.size();
  build();
  for (int i = 1; i <= n; i++) {
    p[i] = i;
  }
  int Ans;
  while (n) {
    int ind1 = bin1(a[n - 1]);
    int ind2 = bin2(a[n - 1]);
    int ind = Map[a[n - 1]];
    int ans = Val[query(ind, ind)];
    if (1 > ans) {
      p[n] = n;
      ans = 1;
    } else {
      p[n] = p[o[ind]];
    }
    if (ind1 != -1) {
      int indPos = query(1, ind1);
      int pos = Val[indPos] + 1;
      if (pos > ans) {
        p[n] = o[indPos];
        ans = pos;
      }
    }
    if (ind2 != infInt) {
      int indPos = query(ind2, m);
      int pos = Val[indPos] + 1;
      if (pos > ans) {
        p[n] = o[indPos];
        ans = pos;
      }
    }
    o[ind] = n;
    update(ind, ans);
    n--;
  }
  Ans = query(1, m);
  cout << Val[Ans] << "\n";
  print(o[Ans]);
  return 0;
}
