#[allow(unused_imports)]
use std::cmp::{min,max};

fn main() {
    let n = read_i64();
    let mut t1 = 0;
    let mut x1 = 0;
    let mut y1 = 0;
    let mut res = true;
    for _i in 0..n {
        let xs = read_vec_i64();
        let (t2,x2,y2) = (xs[0], xs[1], xs[2]);
        let d = (x1-x2).abs() + (y1-y2).abs();
        if d > t2 - t1 || d % 2 != (t2-t1) % 2 {
            res = false;
        }
        t1 = t2; x1 = x2; y1 = y2;
    }
    println!("{}", if res { "Yes" } else { "No" });
}

#[allow(dead_code)]
fn read_line() -> String {
    let mut ret = String::new();
    std::io::stdin().read_line(&mut ret).ok();
    ret.pop();
    return ret;
}

#[allow(dead_code)]
fn read_i64() -> i64 {
    let ss = read_line();
    let mut ret :i64 = 0;
    for c in ss.chars() {
        if ! ('0' <= c && c <= '9') { break; }
        let t = c.to_digit(10).unwrap() as i64;
        ret = ret * 10 + t;
    }
    return ret;
}

#[allow(dead_code)]
fn read_vec_i64() -> Vec<i64> {
    let ss = read_line();
    let mut res = Vec::new();
    let mut edited = false;
    let mut x:i64 = 0;
    for c in ss.chars() {
        if !('0' <= c && c <= '9') {
            if edited {
                edited = false;
                res.push(x);
                x = 0;
            }
        }
        else {
            let t = c.to_digit(10).unwrap() as i64;
            x = x * 10 + t;
            edited = true;
        }
    }
    if edited {
        res.push(x);
    }
    return res;
}
