Problem:
Score : 400 points

Problem Statement

You are given a sequence A_1, A_2, ..., A_N and an integer K.

Print the maximum possible length of a sequence B that satisfies the following conditions:

B is a (not necessarily continuous) subsequence of A.

For each pair of adjacents elements of B, the absolute difference of the elements is at most K.

Constraints

1 \leq N \leq 300,000

0 \leq A_i \leq 300,000

0 \leq K \leq 300,000

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
A_1
A_2
:
A_N

Output

Print the answer.

Sample Input 1

10 3
1
5
4
3
8
6
9
7
2
4

Sample Output 1

7

For example, B = (1, 4, 3, 6, 9, 7, 4) satisfies the conditions.

It is a subsequence of A = (1, 5, 4, 3, 8, 6, 9, 7, 2, 4).

All of the absolute differences between two adjacent elements (|1-4|, |4-3|, |3-6|, |6-9|, |9-7|, |7-4|) are at most K = 3.

Solution in PHP (7.4.4) (judge verdict: Time Limit Exceeded)

<?php
  list($n, $k) = explode(" ", trim(fgets(STDIN)));
  $n=intval($n);
  $k=intval($k);

  $len=0;
  $st = new SegTree(300010, 0);
  for($i=0;$i<$n;$i++){
    list($a) = explode(" ", trim(fgets(STDIN)));
    $a=intval($a);
    $x = $st->query(max($a-$k,0), min($a+$k,300000)+1) + 1;
    $st->update($a,$x);
    $len = max($len, $x);
  }
  echo $len;
  
                   

class SegTree {
  private $N;
  private $INI;
  private $tree=[];

  /**
   * コンストラクタ
   * $n 数列の長さ
   * $ini_value 初期値
   */
  public function __construct($n, $ini_value) {
    $this->N = 1;
    while ($this->N < $n) {
      $this->N *= 2;
    }
    $this->INI = $ini_value;
    $this->tree=array_fill(0, $this->N*2-1, $ini_value);
  }

  public function update($i, $value){
    $i = $this->N + $i - 1;
    $this->tree[$i] = $value;
    while ($i > 0) {
      $i = intdiv($i - 1, 2);
      //$this->tree[$i] = $this->marge($this->tree[$i * 2 + 1], $this->tree[$i * 2 + 2]);
      $this->tree[$i] = max($this->tree[$i * 2 + 1], $this->tree[$i * 2 + 2]);
    }
  }

  public function query($start, $end){
    return $this->sub_query($start, $end, 0, 0, $this->N);
  }

  private function sub_query($start, $end, $k, $l, $r){
    if($r <= $start || $end <= $l){
      return $this->INI;
    }
    if($start <= $l && $r <= $end){
      return $this->tree[$k];
    }else{
      $lv = $this->sub_query($start, $end, 2*$k+1, $l, intdiv($l+$r, 2));
      $rv = $this->sub_query($start, $end, 2*$k+2, intdiv($l+$r, 2), $r);
      //return $this->marge($lv, $rv);
      return max($lv, $rv);
    }
  }

  private function marge($a, $b){
    return max($a,$b);
    //return min($a,$b);
  }

}