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 = 100005;
struct Node {
  int len;
  int prox;
  int id;
};
vector<Node> tree(4 * maxn);
void build(int pos, int i, int j) {
  int esq = 2 * pos;
  int dir = 2 * pos + 1;
  int mid = (i + j) / 2;
  if (i == j) {
    Node t;
    t.len = 0;
    t.prox = -1;
    t.id = -1;
    tree[pos] = t;
  } else {
    build(esq, i, mid);
    build(dir, mid + 1, j);
    Node t;
    t.len = 0;
    t.prox = -1;
    t.id = -1;
    tree[pos] = t;
  }
}
void update(int pos, int i, int j, int x, Node nt) {
  int esq = 2 * pos;
  int dir = 2 * pos + 1;
  int mid = (i + j) / 2;
  if (i == j) {
    tree[pos] = nt;
  } else {
    if (x <= mid)
      update(esq, i, mid, x, nt);
    else
      update(dir, mid + 1, j, x, nt);
    if (tree[esq].len > tree[dir].len)
      tree[pos] = tree[esq];
    else
      tree[pos] = tree[dir];
  }
}
Node query(int pos, int i, int j, int l, int r) {
  int esq = 2 * pos;
  int dir = 2 * pos + 1;
  int mid = (i + j) / 2;
  Node invalid;
  invalid.len = -2;
  invalid.prox = -1;
  invalid.id = -1;
  if (i >= l && j <= r)
    return tree[pos];
  else if (i > r || j < l)
    return invalid;
  else {
    Node t1 = query(esq, i, mid, l, r);
    Node t2 = query(dir, mid + 1, j, l, r);
    if (t1.len > t2.len)
      return t1;
    else
      return t2;
  }
}
int busca(long long x, vector<pair<long long, long long> > &aux) {
  int s = 0;
  int e = aux.size() - 1;
  while (s < e) {
    int p = (s + e) / 2;
    if (aux[p].first < x)
      s = p + 1;
    else
      e = p;
  }
  return s;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  long long d;
  cin >> n >> d;
  vector<pair<long long, long long> > g;
  for (int i = 0; i < n; i++) {
    long long a;
    cin >> a;
    g.push_back({a, i});
  }
  vector<pair<long long, long long> > interv;
  vector<int> trad(n);
  vector<pair<long long, long long> > aux = g;
  sort(aux.begin(), aux.end());
  aux.push_back({1e17, -1});
  for (int i = 0; i < n; i++) {
    trad[aux[i].second] = i;
    int l = busca(aux[i].first - d + 1, aux);
    int r = busca(aux[i].first + d, aux);
    interv.push_back({l, r});
  }
  build(1, 0, n - 1);
  int best = 0;
  int idx = -1;
  vector<Node> all(n);
  for (int i = n - 1; i >= 0; i--) {
    int nid = trad[i];
    int l = interv[nid].first;
    int r = interv[nid].second;
    Node t1 = query(1, 0, n - 1, 0, l - 1);
    Node t2 = query(1, 0, n - 1, r, n - 1);
    Node t;
    if (t1.len > t2.len)
      t = t1;
    else
      t = t2;
    Node nt;
    nt.len = t.len + 1;
    nt.id = i;
    nt.prox = t.id;
    all[i] = nt;
    if (nt.len > best) {
      best = nt.len;
      idx = i;
    }
    update(1, 0, n - 1, nid, nt);
  }
  cout << best << endl;
  while (idx != -1) {
    cout << idx + 1 << " ";
    idx = all[idx].prox;
  }
  cout << endl;
}
