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