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;
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return __builtin_popcountll(s);
}
const int bfsz = 1 << 16;
char bf[bfsz + 5];
int rsz = 0;
int ptr = 0;
char gc() {
  if (rsz <= 0) {
    ptr = 0;
    rsz = (int)fread(bf, 1, bfsz, stdin);
    if (rsz <= 0) return EOF;
  }
  --rsz;
  return bf[ptr++];
}
void ga(char &c) {
  c = EOF;
  while (!isalpha(c)) c = gc();
}
int gs(char s[]) {
  int l = 0;
  char c = gc();
  while (isspace(c)) c = gc();
  while (c != EOF && !isspace(c)) {
    s[l++] = c;
    c = gc();
  }
  s[l] = '\0';
  return l;
}
template <class T>
bool gi(T &v) {
  v = 0;
  char c = gc();
  while (c != EOF && c != '-' && !isdigit(c)) c = gc();
  if (c == EOF) return false;
  bool neg = c == '-';
  if (neg) c = gc();
  while (isdigit(c)) {
    v = v * 10 + c - '0';
    c = gc();
  }
  if (neg) v = -v;
  return true;
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
int n;
long long d, h[200005];
vector<long long> V;
pair<long long, long long> fu[200005], fd[200005];
int back[200005], f[200005];
pair<long long, long long> getup(int u) {
  pair<long long, long long> res = make_pair(0, 0);
  for (int i = u; i < 200005; i += i & -i) {
    res = max(res, fd[i]);
  }
  return res;
}
pair<long long, long long> getdown(int u) {
  pair<long long, long long> res = make_pair(0, 0);
  for (int i = u; i > 0; i -= i & -i) {
    res = max(res, fu[i]);
  }
  return res;
}
void updateup(pair<long long, long long> P, int u) {
  for (int i = u; i < 200005; i += i & -i) {
    fu[i] = max(fu[i], P);
  }
}
void updatedown(pair<long long, long long> P, int u) {
  for (int i = u; i > 0; i -= i & -i) {
    fd[i] = max(fd[i], P);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> d;
  V.push_back(-1000000005);
  for (int i = (1); i <= (n); ++i) {
    cin >> h[i];
    V.push_back(h[i]);
  }
  memset(back, 0, sizeof(back));
  for (int i = 0; i < (200005); ++i) {
    fu[i] = make_pair(0, 0);
    fd[i] = make_pair(0, 0);
  }
  int vt = -1;
  int res = 0;
  sort((V).begin(), (V).end());
  for (int i = (1); i <= (n); ++i) {
    int x = lower_bound((V).begin(), (V).end(), h[i]) - V.begin();
    long long u = h[i] - d;
    int a = lower_bound((V).begin(), (V).end(), u + 1) - V.begin() - 1;
    pair<long long, long long> P1 = getdown(a);
    u = h[i] + d;
    int b = lower_bound((V).begin(), (V).end(), u) - V.begin();
    pair<long long, long long> P2 = getup(b);
    pair<long long, long long> P = max(P1, P2);
    back[i] = P.second;
    f[i] = P.first + 1;
    updatedown(make_pair(f[i], i), x);
    updateup(make_pair(f[i], i), x);
    if (f[i] > res) {
      res = f[i];
      vt = i;
    }
  }
  vector<int> RR;
  while (vt) {
    RR.push_back(vt);
    vt = back[vt];
  }
  cout << ((int)(RR).size()) << endl;
  for (int i = ((int)(RR).size()) - 1; i >= 0; i--) cout << RR[i] << " ";
  return 0;
}
