https://coderun.yandex.ru/selections/autumn-intern-2023/problems/lis-large-length?compiler=java Сложная

Решение

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();
    }
}