#include <stdio.h>

int main(void){
	int v[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};  /* d をベクトル化するための配列 */
	int N, n, d;
	int x[200-1], y[200-1];
	int i, j, xmax, xmin, ymax, ymin;

	while (scanf("%d", &N) == 1){
		if (N < 1 || N >= 200){
			break;
		}

		/* 正方形を並べる */
		x[0] = 0;
		y[0] = 0;
		for (i = 1; i < N; i++){
			scanf("%d %d", &n, &d);
			x[i] = x[n] + v[d][0];
			y[i] = y[n] + v[d][1];
		}

		/* 最も左、下、右、上にある正方形の座標を調べる */
		xmax = x[0];
		xmin = x[0];
		ymax = y[0];
		ymin = y[0];
		for (i = 1; i < N; i++){
			if (x[i] < xmin){
				xmin = x[i];
			}else if (x[i] > xmax){
				xmax = x[i];
			}
			if (y[i] < ymin){
				ymin = y[i];
			}else if (y[i] > ymax){
				ymax = y[i];
			}
		}

		/* 必要な箱の大きさを出力する */
		/* xmax, xmin の絶対値はそれぞれ、座標平面の正の部分、負の部分の大きさを表す */
		/* ゆえに 箱の大きさは xmax - xmin + 1 */
		printf("%d %d\n", xmax - xmin + 1, ymax - ymin + 1);
	}

    return 0;
}