Use this to learn the idea, then write your own version.
1struct SegmentTreeNode {2 int lo;3 int hi;4 int maxLength;5 std::unique_ptr<SegmentTreeNode> left;6 std::unique_ptr<SegmentTreeNode> right;7 8 SegmentTreeNode(int lo, int hi, int maxLength,9 std::unique_ptr<SegmentTreeNode> left = nullptr,10 std::unique_ptr<SegmentTreeNode> right = nullptr)11 : lo(lo),12 hi(hi),13 maxLength(maxLength),14 left(std::move(left)),15 right(std::move(right)) {}16};17 18class SegmentTree {19 public:20 explicit SegmentTree() : root(make_unique<SegmentTreeNode>(0, 1e5 + 1, 0)) {}21 22 void updateRange(int i, int j, int maxLength) {23 update(root, i, j, maxLength);24 }25 26 27 int queryRange(int i, int j) {28 return query(root, i, j);29 }30 31 private:32 std::unique_ptr<SegmentTreeNode> root;33 34 void update(std::unique_ptr<SegmentTreeNode>& root, int i, int j,35 int maxLength) {36 if (root->lo == i && root->hi == j) {37 root->maxLength = maxLength;38 root->left = nullptr;39 root->right = nullptr;40 return;41 }42 const int mid = root->lo + (root->hi - root->lo) / 2;43 if (root->left == nullptr) {44 root->left = make_unique<SegmentTreeNode>(root->lo, mid, root->maxLength);45 root->right =46 make_unique<SegmentTreeNode>(mid + 1, root->hi, root->maxLength);47 }48 if (j <= mid)49 update(root->left, i, j, maxLength);50 else if (i > mid)51 update(root->right, i, j, maxLength);52 else {53 update(root->left, i, mid, maxLength);54 update(root->right, mid + 1, j, maxLength);55 }56 root->maxLength = merge(root->left->maxLength, root->right->maxLength);57 }58 59 int query(std::unique_ptr<SegmentTreeNode>& root, int i, int j) {60 if (root->left == nullptr)61 return root->maxLength;62 if (root->lo == i && root->hi == j)63 return root->maxLength;64 const int mid = root->lo + (root->hi - root->lo) / 2;65 if (j <= mid)66 return query(root->left, i, j);67 if (i > mid)68 return query(root->right, i, j);69 return merge(query(root->left, i, mid), query(root->right, mid + 1, j));70 }71 72 int merge(int left, int right) const {73 return max(left, right);74 };75};76 77class Solution {78 public:79 int lengthOfLIS(vector<int>& nums, int k) {80 int ans = 1;81 SegmentTree tree;82 83 for (const int num : nums) {84 const int left = max(1, num - k);85 const int right = num - 1;86 87 const int maxLength = tree.queryRange(left, right) + 1;88 ans = max(ans, maxLength);89 tree.updateRange(num, num, maxLength);90 }91 92 return ans;93 }94};95