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;
long long numbers[100005];
int predecessors[100005];
pair<int, int> tree[266666];
void update(int a, pair<int, int> v, int i = 1, int start = 0,
            int end = 100010) {
  if (end - start == 1) {
    tree[i] = v;
    return;
  }
  int mid = (start + end) / 2;
  if (a < mid)
    update(a, v, i * 2, start, mid);
  else
    update(a, v, i * 2 + 1, mid, end);
  tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}
pair<int, int> query(int a, int b, int i = 1, int start = 0, int end = 100010) {
  if (start == a && end == b) return tree[i];
  int mid = (start + end) / 2;
  pair<int, int> lanswer, ranswer;
  if (a < mid) lanswer = query(a, min(b, mid), i * 2, start, mid);
  if (b > mid) ranswer = query(max(a, mid), b, i * 2 + 1, mid, end);
  return max(lanswer, ranswer);
}
int main() {
  int n;
  long long d;
  cin >> n >> d;
  int longest = 0;
  int longestIndex = 0;
  multimap<long long, int> sortedNumbers;
  for (int i = 0; i < n; i++) {
    long long j;
    cin >> j;
    sortedNumbers.insert(make_pair(j, 0));
    numbers[i] = j;
  }
  int z = 0;
  long long prev = -1;
  for (auto &element : sortedNumbers) {
    element.second = z++;
    prev = element.first;
  }
  for (int i = 0; i < n; i++) {
    long long lowerbound = numbers[i] - d + 1;
    long long upperbound = numbers[i] + d - 1;
    auto normallower = sortedNumbers.lower_bound(lowerbound);
    auto normalupper = sortedNumbers.upper_bound(upperbound);
    pair<int, int> bestn = make_pair(0, 0);
    if (normalupper != sortedNumbers.end()) {
      int nu = normalupper->second;
      bestn = max(bestn, query(nu, 100010));
    }
    if (normallower != sortedNumbers.end()) {
      int nl = normallower->second;
      bestn = max(bestn, query(0, nl));
    }
    predecessors[i] = bestn.second;
    int best = bestn.first + 1;
    if (best > longest) {
      longest = best;
      longestIndex = i;
    }
    int num = sortedNumbers.find(numbers[i])->second;
    update(num, make_pair(best, i));
  }
  cout << longest << '\n';
  predecessors[0] = -1;
  vector<int> preStack;
  while (longest > 0) {
    preStack.push_back(longestIndex + 1);
    longestIndex = predecessors[longestIndex];
    longest--;
  }
  while (preStack.size() > 1) {
    cout << preStack.back() << ' ';
    preStack.pop_back();
  }
  cout << preStack.back() << "\n";
}
