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 primero = 1 << 19;
const int tope = 1 << 20;
pair<int, int> maximo[tope];
void inserta(int pos, pair<int, int> val) {
  pos += primero;
  maximo[pos] = max(maximo[pos], val);
  while (pos > 1) {
    pos /= 2;
    maximo[pos] = max(maximo[2 * pos], maximo[2 * pos + 1]);
  }
}
pair<int, int> maximoentre(int pos1, int pos2) {
  if (pos1 > pos2) return pair<int, int>(0, 0);
  pos1 += primero;
  pos2 += primero;
  if (pos1 == pos2) return maximo[pos1];
  pair<int, int> maxi = max(maximo[pos1], maximo[pos2]);
  while (pos1 + 1 < pos2) {
    if (pos1 % 2 == 0) maxi = max(maxi, maximo[pos1 + 1]);
    pos1 /= 2;
    if (pos2 % 2 == 1) maxi = max(maxi, maximo[pos2 - 1]);
    pos2 /= 2;
  }
  return maxi;
}
long long int hh[1000000];
int topehh;
int htoposinf(long long int h) {
  int inf = 0;
  int sup = topehh;
  while (inf + 1 < sup) {
    int med = (inf + sup) / 2;
    if (hh[med] <= h)
      inf = med;
    else
      sup = med;
  }
  return inf;
}
int htopossup(long long int h) {
  int inf = 0;
  int sup = topehh;
  while (inf + 1 < sup) {
    int med = (inf + sup) / 2;
    if (hh[med] < h)
      inf = med;
    else
      sup = med;
  }
  return sup;
}
long long int h[1000000];
int sol[1000000];
int siguiente[1000000];
int main() {
  long long int n, d;
  cin >> n >> d;
  map<long long int, int> posh;
  for (int i = 1; i <= n; i++) {
    cin >> h[i];
    posh[h[i]];
  }
  topehh = 1;
  for (map<long long int, int>::iterator it = posh.begin(); it != posh.end();
       it++, topehh++) {
    hh[topehh] = it->first;
    it->second = topehh;
  }
  for (int i = n; i >= 1; i--) {
    pair<int, int> p = max(maximoentre(1, htoposinf(h[i] - d)),
                           maximoentre(htopossup(h[i] + d), topehh));
    sol[i] = 1 + p.first;
    siguiente[i] = p.second;
    inserta(posh[h[i]], pair<int, int>(sol[i], i));
  }
  pair<int, int> p = maximo[1];
  int u = p.second;
  cout << p.first << endl;
  cout << u;
  while (siguiente[u] != 0) {
    u = siguiente[u];
    cout << " " << u;
  }
  cout << endl;
}
