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 C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#define QUEUE_SIZE 100000

typedef struct{
  int x;
  int y;
}point;

typedef struct{
  point crt;
  int t;
}arg;

typedef struct{
  arg buf[QUEUE_SIZE];
  int front;
  int rear;
  int num;
}queue;

queue qu;


int enqueue(arg x){
  if(qu.num==QUEUE_SIZE-1)return -1;
  else{
    qu.buf[qu.rear]=x;
    qu.num++;
    qu.rear=(qu.rear+1)%QUEUE_SIZE;
    return 1;
  }
}

arg dequeue(void){
  arg temp;
  if(qu.num==0) return;
  else{
    qu.num--;
    temp=qu.buf[qu.front];
    qu.front=(qu.front+1)%QUEUE_SIZE;
    return temp;
  }
}

int move(point current,point dest,int now,int t){
  arg temp;
  if (current.x==dest.x&&current.y==dest.y){
    return ((now-t)%2==0)?1:-1;
  }
  if(t==t) return -1;
  if(current.x+1>=0){
    temp.crt.x=current.x+1;
    temp.crt.y=current.y;
    temp.t=now+1;
    enqueue(temp);
  }
  if(current.y+1>=0){
    temp.crt.x=current.x;
    temp.crt.y=current.y+1;
    temp.t=now+1;
    enqueue(temp);
  }
  if(qu.num==0) return -1;
  temp=dequeue();
  move(temp.crt,dest,temp.t,t);
}

int main(void){
  int N;
  int i;
  point c,d;
  int now,t;
  c.x=0;c.y=0;
  now=0;

  qu.front=0;
  qu.rear=0;
  qu.num=0;
  scanf("%d",&N);
  for(i=0;i<N;i++){
    scanf("%d %d %d",&t,&d.x,&d.y);
    d.x=abs(d.x-c.x);
    d.y=abs(d.y-c.y);
    c.x=0;c.y=0;
    if(move(c,d,now,t)==-1) {
        puts("Yes");
        return 0;
    }
    c=d;
    now=t;
  }
  puts("No");
  return 0;
  return 0;
}