#include "elephants.h"
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
const int sqr=400,inf=2e9;
int n,l;
vector<int>x,y;
struct BLOCK{
vector<int>a;
vector<pair<int,int>>b;
int mx=inf;
void build(){
mx=0;
sort(begin(a),end(a));
b=vector<pair<int,int>>(a.size());
for(int i=a.size()-1,it;i>=0;--i){
it=upper_bound(begin(a),end(a),a[i]+l)-begin(a);
b[i].first=1;
b[i].second=a[i];
if(it!=a.size())b[i].first+=b[it].first,b[i].second=b[it].second;
}
}
void del(int e){
vector<int>c;
bool dl=0;
for(int i=0;i<a.size();++i){
if(a[i]!=e||dl)c.push_back(a[i]);
else dl=1;
}
a=c;
assert(dl);
build();
}
};
vector<BLOCK>B(sqr);
int upd=0;
void build(){
y=x;
upd=0;
for(int i=0;i<sqr;++i)B[i].a.clear();
sort(begin(y),end(y));
for(int i=0;i<n;++i)B[i/sqr].a.push_back(y[i]);
for(int i=0;i<sqr;++i)B[i].build();
}
void init(int N, int L, int X[])
{
for(int i=0;i<N;++i)x.push_back(X[i]);
n=N;
l=L;
build();
}
int find(int a){
int last=-1;
for(int i=0;i<sqr;++i){
if(!B[i].a.empty()){
last=i;
if(B[i].a.back()>=a)return i;
}
}
return last;
}
int update(int i, int y)
{
if(++upd==sqr){
x[i]=y;
build();
}
else{
int b1=find(x[i]),b2;
B[b1].del(x[i]);
b2=find(y);
B[b2].a.push_back(y);
B[b2].build();
x[i]=y;
}
int ans=0,lf=-(2*l),it;
for(int i=0;i<sqr;++i){
if(B[i].a.empty())break;
it=upper_bound(begin(B[i].a),end(B[i].a),lf+l)-begin(B[i].a);
if(it!=B[i].a.size()){
ans+=B[i].b[it].first;
lf=B[i].b[it].second;
}
}
return ans;
}