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 Java7 (OpenJDK 1.7.0) (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main {
	private int currentPositionX;
	private int currentPositionY;
	private int currentSecond;
	private static int MAXNUMBER = 100000 - 1;

	private class TravelPosition {
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + getOuterType().hashCode();
			result = prime * result + x;
			result = prime * result + y;
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (!(obj instanceof TravelPosition)) {
				return false;
			}
			TravelPosition other = (TravelPosition) obj;
			if (x != other.x)
				return false;
			if (y != other.y)
				return false;
			return true;
		}

		final int x;
		final int y;

		TravelPosition(int x, int y) {
			this.x = x;
			this.y = y;
		}

		private Main getOuterType() {
			return Main.this;
		}

	}

	public List<TravelPosition> createNextTravelPosition(int positionX,
			int positionY) {
		List<TravelPosition> postionList = new ArrayList<TravelPosition>();
		if (positionX < MAXNUMBER) {
			postionList.add(new TravelPosition(positionX + 1, positionY));
		}
		if (positionX != 0) {
			postionList.add(new TravelPosition(positionX - 1, positionY));
		}
		if (positionY < MAXNUMBER) {
			postionList.add(new TravelPosition(positionX, positionY + 1));
		}
		if (positionY != 0) {
			postionList.add(new TravelPosition(positionX, positionY - 1));
		}
		return postionList;
	}

	public boolean isAvailablePlan(int second, int positionX, int positionY) {
		int x = currentPositionX;
		int y = currentPositionY;
		List<TravelPosition> currentPositionList = createNextTravelPosition(x,
				y);
		for (; currentSecond < second; currentSecond++) {
			List<TravelPosition> positionList = new ArrayList<TravelPosition>();
			for (TravelPosition position : currentPositionList) {
				for (TravelPosition position2 : createNextTravelPosition(
						position.x, position.y)) {
					if (((positionX - position2.x < second - currentSecond) && (positionY
							- position2.y < positionX - position2.x))
							|| ((positionY - position2.y < second
									- currentSecond) && (positionX
									- position2.x < positionY - position2.y))) {
						if (!positionList.contains(position2)) {
							positionList.add(position2);
						}
					}
				}
			}
			currentPositionList = positionList;
		}
		for (TravelPosition position : currentPositionList) {
			for (TravelPosition position2 : createNextTravelPosition(
					position.x, position.y)) {
				if (position2.x == positionX && position2.y == positionY) {
					currentPositionX = positionX;
					currentPositionY = positionY;
					currentSecond = second;
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					System.in));
			String inputLine1 = reader.readLine();
			int maxLine = Integer.valueOf(inputLine1);
			Main main = new Main();
			for (int i = 0; i < maxLine; i++) {
				String inputLine2 = reader.readLine();
				String numbers[] = inputLine2.split(" ");
				if (!main.isAvailablePlan(Integer.valueOf(numbers[0]),
						Integer.valueOf(numbers[1]),
						Integer.valueOf(numbers[2]))) {
					System.out.println("No");
					System.exit(0);
				}
			}
			System.out.println("Yes");
		} catch (IOException ignore) {
		}
	}
}