func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1000 * 100 + 10;   int n, d[N], par[N];   pair<int, int> tr[N * 4];   pair<long long, int> a[N], b[N];   void add(int val, int p, int b = 0, int e = n, int ind = 1) {     tr[ind] = max(tr[ind], make_pair(val, p));     if (b + 1 == e) return;     int mid = (b + e) / 2;     if (p < mid)       add(val, p, b, mid, ind * 2);     else       add(val, p, mid, e, ind * 2 + 1);     return;   }   pair<int, int> get(int l, int r, int b = 0, int e = n, int ind = 1) {     if (l <= b && e <= r) return tr[ind];     int mid = (b + e) / 2;     pair<int, int> ret = make_pair(0, 0);     if (l < mid) ret = get(l, r, b, mid, ind * 2);     if (r > mid) ret = max(get(l, r, mid, e, ind * 2 + 1), ret);     return ret;   }   void pp(int v) {     if (d[v] == 1) {       cout << v + 1 <<    ;       return;     }     pp(par[v]);     cout << v + 1 <<    ;     return;   }   int main() {     ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);     long long k;     cin >> n >> k;     for (int i = 0; i < n; i++) {       cin >> a[i].first;       b[i].first = a[i].first;       b[i].second = i;     }     sort(b, b + n);     for (int i = 0; i < n; i++) a[b[i].second].second = i;     d[0] = 1;     add(1, a[0].second);     for (int i = 1; i < n; i++) {       int l = upper_bound(b, b + n, make_pair(a[i].first - k, n)) - b;       int r = lower_bound(b, b + n, make_pair(a[i].first + k, 0)) - b;       if (l) {         pair<int, int> temp = get(0, l);         d[i] = temp.first + 1;         par[i] = b[temp.second].second;       }       if (r < n) {         pair<int, int> temp = get(r, n);         if (temp.first >= d[i]) {           d[i] = temp.first + 1;           par[i] = b[temp.second].second;         }       }       add(d[i], a[i].second);     }     long long maxx = 0, maxind;     for (int i = 0; i < n; i++) {       if (d[i] > maxx) {         maxx = d[i];         maxind = i;       }     }     cout << maxx << endl;     pp(maxind);   }   