unittest
{
	assert( [ "2", "3 1 2", "6 1 1" ].parse.expand.solve == "Yes" );
	assert( [ "1", "2 100 100" ].parse.expand.solve == "No" );
	assert( [ "2", "5 1 1", "100 1 1" ].parse.expand.solve == "No" );
}



import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.strip.to!( long );
	auto txys = new long[ 3 ][ n ];
	foreach( ref txy; txys )
	{
		input.popFront;
		txy = input.front.split.to!( long[] );
	}
	return tuple( txys );
}

auto solve( long[ 3 ][] txys )
{
	auto txy_p = [ 0L, 0L, 0L ];
	
	foreach( txy; txys )
	{
		auto dd = ( txy[ 1 ] - txy_p[ 1 ] ).abs + ( txy[ 2 ] - txy_p[ 2 ] ).abs;
		auto dt = txy[ 0 ] - txy_p[ 1 ];
		
		if( dt < dd || ( dt - dd ) % 2 == 1 ) return "No";
		
		txy_p[] = txy[];
	}
	
	return "Yes";
}
