#include <stdio.h>

#define N_MAX 200

/* 正方形の位置を記録する構造体 */
typedef struct {
  int x;
  int y;
} Square;

int main(void) {
  int N;
  
 
  
  while(scanf("%d", &N) != EOF) { // 作品の制作手数を読み込む
    /* x,y座標で最大と最小を記録しておく */
    int max_x = 0;
    int min_x = 0;
    int max_y = 0;
    int min_y = 0;
    
    int i;

    /* 一番最初の正方形を(0,0)として，付け足してゆく正方形の座標を測る */
    Square sqrs[N_MAX];
    sqrs[0].x = 0;
    sqrs[0].y = 0;
    
    if (N == 0)
      break; // Nが0だったら終了

    for (i=1; i<N; i++) { // 制作手順を一行ずつ読んで，正方形を付け足してゆく
      int x, y; // 新しく付け足す正方形の座標
      int n, d; // 新しい正方形を付け足すすでにある正方形の番号と，正方形付け足す向き
      scanf("%d %d", &n, &d); // 手順を読み込む

      x = sqrs[n].x; // 付け足す元の正方形の座標を読み込んでおく
      y = sqrs[n].y;
      /* 指定された向きより付けたす正方形の座標を決める */
      switch(d) {
      case 0: // 左側
	x--;
	break;
      case 1: // 下側
	y--;
	break;
      case 2: // 右側
	x++;
	break;
      case 3: // 上川
	y++;
	break;
      }

      /* 新しく付け足す正方形の座標を代入*/
      sqrs[i].x = x;
      sqrs[i].y = y;

      /* 新しく付け足す正方形の座標が最大，最小であれば，更新 */
      if (x > max_x) {
	max_x = x;
      } else if (x < min_x) {
	min_x = x;
      }
      if (y > max_y) {
	max_y = y;
      } else if (y < min_y) {
	min_y = y;
      }

    }

    /* 作品の幅と高さは，x,y座標それぞれぞれの最大と最小の差+1（正方形の中心を座標としてとっているため） */
    printf("%d %d\n", max_x-min_x+1, max_y-min_y+1);
  }
}