Problem:
Problem C: Warping Girl

Problem

会津魔法学校は, 魔法を使える者が集まる学校である. その学校の生徒の一人であるハルカは, 魔法陣の上でワープの魔法を使う事ができる.

彼女の家から学校には, 長さ L の一直線状の道がある. また, この道には所々魔法陣が描かれている.

彼女は毎日この道を使って学校に通っているため, できるだけ短い時間で学校に辿り着きたいと思っている.

そこでプログラマーであるあなたは, 彼女に学校まで行くときにかかる最小の時間を教えてあげることにした.

ハルカは, 1 分で距離 1 だけ歩いて先に進むことができる ( ＊戻ることはできない)．また, ワープの魔法陣が書いてある位置 Pi で魔法を唱えることで, Pi からちょうど Di だけ進んだ場所に Ti 分で移動することができる. 移動先に魔法陣がある場合も, 連続してワープ魔法を使用することができる.

彼女の家の位置は 0、学校の位置は L である.

Input

L n
P1 D1 T1
P2 D2 T2
.
.
Pn Dn Tn

１行目に道の長さ L, 魔法陣の数 n が与えられる.
次に n 個の魔法陣の状態が与えられる.
Pi は i 番目の魔法陣がある位置, Di は i 番目の魔法陣からワープする距離, Ti は i 番目の魔法陣を使ってワープしたときにかかる時間を表す.

Constraints

入力は以下の条件を満たす.

与えられる数は全て整数である

1 ≤ L ≤ 109

0 ≤ n ≤ min(103, L) (min はA, B の小さい方を表す)

0 ≤ Pi ≤ L - 1

0 ≤ Di ≤ L - Pi

0 ≤ Ti ≤ 103

Pi ≠ Pj

Output

学校に辿り着くための最小の時間を一行に出力せよ.

Sample Input 1

10 3
2 2 1
4 2 1
8 1 1

Sample Output 1

8

Sample Input 2

10 2
2 3 1
3 5 1

Sample Output 2

6

Sample Input 3

1 0

Sample Output 3

1

Solution in Scala (judge verdict: Accepted)


object Main extends App {

  import scala.io.StdIn._

  val Array(l, n) = readLine.trim.split(' ').map(_.toInt)
  val circles = Array.tabulate(n){_ ⇒
    val Array(p, d, t) = readLine.trim.split(' ').map(_.toLong)
    (p, d, t)
  }.sortBy(_._1)
  val position= circles.map(_._1) :+ l.toLong
  val minTime = position.map{i ⇒ i}
  for (i ← circles.indices){
    val (p, d, t) = circles(i)
    if (minTime(i + 1) > minTime(i) + position(i + 1) - position(i)) minTime(i + 1) = minTime(i) + position(i + 1) - position(i)
    lowerBound(position, p + d) match {
      case pos if minTime(pos) > minTime(i) + t + position(pos) - p - d ⇒
        minTime(pos) = minTime(i) + t + position(pos) - p - d
      case _ ⇒
    }
  }
  println(minTime.last)
  def lowerBound[T](array: Array[T], target: T)(implicit ord: Ordering[T]): Int = {
    var left = 0
    var right = array.length
    while(left < right){
      val mid = (left + right) / 2
      if (ord.compare(array(mid), target) < 0){
        left = mid + 1
      }else {
        right = mid
      }
    }
    right
  }
  implicit class Extend[T](value: T){
    def also(func: T ⇒ Unit): T = {func(value); value}
    def let[A](func: T ⇒ A): A = func(value)
  }
}