Problem:
Score : 300 points

Problem Statement

AtCoDeer the deer is going on a trip in a two-dimensional plane.
In his plan, he will depart from point (0, 0) at time 0, then for each i between 1 and N (inclusive), he will visit point (x_i,y_i) at time t_i.

If AtCoDeer is at point (x, y) at time t, he can be at one of the following points at time t+1: (x+1,y), (x-1,y), (x,y+1) and (x,y-1).
Note that he cannot stay at his place.
Determine whether he can carry out his plan.

Constraints

1 ≤ N ≤ 10^5

0 ≤ x_i ≤ 10^5

0 ≤ y_i ≤ 10^5

1 ≤ t_i ≤ 10^5

t_i < t_{i+1} (1 ≤ i ≤ N-1)

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
t_1 x_1 y_1
t_2 x_2 y_2
:
t_N x_N y_N

Output

If AtCoDeer can carry out his plan, print Yes; if he cannot, print No.

Sample Input 1

2
3 1 2
6 1 1

Sample Output 1

Yes

For example, he can travel as follows: (0,0), (0,1), (1,1), (1,2), (1,1), (1,0), then (1,1).

Sample Input 2

1
2 100 100

Sample Output 2

No

It is impossible to be at (100,100) two seconds after being at (0,0).

Sample Input 3

2
5 1 1
100 1 1

Sample Output 3

No

Solution in Kotlin (1.0.0) (judge verdict: Accepted)

import java.io.InputStream
import java.io.PrintStream
import java.util.*

class Arc089A(
    val input: InputStream,
    val output: PrintStream
) {
    data class Pos(val t: Int, val x: Int, val y: Int)

    /**
     * 指定した２つのポイント間で移動が可能か
     * 移動可能か?
     *
     * abs(x - x), abs(y - y) <= t
     * 偶数のときと奇数のときで移動できる座標に制約がある
     */
    fun calc(a: Pos, b: Pos): Boolean {
        // 移動距離が範囲内であれば基本的には問題ないが
        val dis = Math.abs(b.x - a.x) + Math.abs(b.y - a.y)
        val td = b.t - a.t
        if (dis > td) {
            return false
        }

        // 移動量が奇数の場合、同じ位置には戻ってこれない
        // もうちょっと一般化すると
        // x + y の偶数の場合、移動量が偶数なら x + y が偶数の位置にのみ移動できる
        // 奇数の場合も同様
        // x + y が偶数の場合、移動量が奇数なら x + y が奇数の位置にのみ移動できる
        if (dis % 2 != td % 2) {
            return false
        }

        return true
    }

    fun proc() {


        val sc = Scanner(input)
        val n = sc.nextInt()

        val posList = listOf(Pos(0, 0, 0)) +
                generateSequence {
                    Pos(
                        t = sc.nextInt(),
                        x = sc.nextInt(),
                        y = sc.nextInt()
                    )
                }.take(n).toList()

        var i = 0
        while (i < posList.size - 1) {
            if (calc(posList[i], posList[i + 1])) {
                // ok
            } else {
                output.print("No")
                return
            }
            ++i
        }
        output.print("Yes")
        return
    }
}

fun main(args: Array<String>) {
    Arc089A(System.`in`, System.out).proc()
}