#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define maxn 200005
#define f first
#define s second
#define ll long long
#define pb(x) push_back(x)
#define mp make_pair
#define all(x) x.begin(), x.end()
struct Node{
    int l=-1, r=-1, val=0;
};
Node ex;
vector<Node>tree[2];
int inf=1e9+1, sh[2]={1,1};
void upd(int v, int j, int l, int tl, int tr, int val){
    tree[j][v].val=max(tree[j][v].val, val);
    if(tl==tr){
        return;
    }
    int tm=(tl+tr)/2;
    if(tr-tm<tm-tl){
        tm--;
    }
    if(tm<l){
        if(tree[j][v].r==-1){
            tree[j][v].r=sh[j];sh[j]++;
            tree[j].pb(ex);
        }
        upd(tree[j][v].r, j,l, tm+1, tr, val);
    }else{
        if(tree[j][v].l==-1){
            tree[j][v].l=sh[j];sh[j]++;
            tree[j].pb(ex);
        }
        upd(tree[j][v].l, j,l, tl, tm, val);
    }
}
int get(int v, int j, int l, int r, int tl, int tr){
    if(l<=tl&&tr<=r){
        return tree[j][v].val;
    }
    if(l>tr||tl>r){
        return 0;
    }
    int tm=(tl+tr)/2;
    if(tree[j][v].l==-1)
    return get(tree[j][v].r, j, l, r, tm+1, tr);
    if(tree[j][v].r==-1)
    return get(tree[j][v].l, j, l, r, tl, tm);
    return max(get(tree[j][v].l, j, l, r, tl, tm), get(tree[j][v].r, j, l, r, tm+1, tr));
}
void solve(){
    int n, m;
    cin >> n >> m;
    int a[n];
    for(int i=0; i<n; i++){
        cin >> a[i];
    }
    tree[0].pb(ex);
    tree[1].pb(ex);
    upd(0, 0, inf, -inf, inf, 0);
    upd(0, 0, inf, -inf, inf, 0);
    for(int i=n-1; i>=0; i--){
        int f=max(get(0, 0,a[i]+1-m, inf, -inf, inf),get(0, 1,a[i]+1-m, inf, -inf, inf));
        upd(0, 1, a[i]-m, -inf, inf, f+1);
        f=get(0, 0,a[i]+1, inf, -inf, inf);
        upd(0, 0, a[i], -inf, inf, f+1);
    }
    cout << tree[1][0].val;
}
int main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    int t=1;
    //cin >> t;
    while(t--){
        solve();
        cout << "\n";
    }
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |