Решение
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
static int m;
static int[] segTree;
static void update(int pos, int value) {
pos += m;
segTree[pos] = Math.max(segTree[pos], value);
while(pos > 1) {
pos /= 2;
segTree[pos] = Math.max(segTree[pos * 2], segTree[pos * 2 + 1]);
}
}
static int query(int l, int r) {
l += m; r += m;
int res = 0;
while(l <= r) {
if(l % 2 == 1) {
res = Math.max(res, segTree[l]);
l++;
}
if(r % 2 == 0) {
res = Math.max(res, segTree[r]);
r--;
}
l /= 2;
r /= 2;
}
return res;
}
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(reader.readLine());
int n = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(reader.readLine());
for(int i = 0; i < n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int size = n + 1;
m = 1;
while(m < size) {
m <<= 1;
}
segTree = new int[2 * m];
int ans = 0;
for (int i = 0; i < n; i++) {
int a = arr[i];
int L = a - b;
if(L < 0) {
L = 0;
}
int best = query(L, a);
int dp = best + 1;
update(a, dp);
if(dp > ans) {
ans = dp;
}
}
writer.write(String.valueOf(ans));
writer.flush();
reader.close();
writer.close();
}
}