#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>

// x座標のmaxmin、y座標のmaxminを更新する

struct kaiga
{
    int num;
    int x;
    int y;
};

int max(int a, int b)
{
    if (a < b)
    {
        return b;
    }
    else
    {
        return a;
    }
}

int min(int a, int b)
{
    if (a < b)
    {
        return a;
    }
    else
    {
        return b;
    }
}

int main(void)
{
    int N, i;
    while (true)
    {
        int x_min = 0, x_max = 0, y_min = 0, y_max = 0;
        scanf("%d", &N);
        if (N == 0)
        {
            return 0;
        }
        int n[N], d[N];
        for (i = 0; i < N - 1; i++)
        {
            scanf("%d %d", &n[i], &d[i]);
        }
        struct kaiga sakuhin[N];
        sakuhin[0].num = 0;
        sakuhin[0].x = 0;
        sakuhin[0].y = 0;
        for (i = 1; i < N; i++)
        {
            sakuhin[i].num = i;
            if (d[i - 1] == 0)
            {
                sakuhin[i].x = sakuhin[n[i - 1]].x - 1;
                sakuhin[i].y = sakuhin[n[i - 1]].y;
            }
            else if (d[i - 1] == 1)
            {
                sakuhin[i].x = sakuhin[n[i - 1]].x;
                sakuhin[i].y = sakuhin[n[i - 1]].y - 1;
            }
            else if (d[i - 1] == 2)
            {
                sakuhin[i].x = sakuhin[n[i - 1]].x + 1;
                sakuhin[i].y = sakuhin[n[i - 1]].y;
            }
            else
            {
                sakuhin[i].x = sakuhin[n[i - 1]].x;
                sakuhin[i].y = sakuhin[n[i - 1]].y + 1;
            }
            x_max = max(x_max, sakuhin[i].x);
            x_min = min(x_min, sakuhin[i].x);
            y_max = max(y_max, sakuhin[i].y);
            y_min = min(y_min, sakuhin[i].y);
        }
        printf("%d %d\n", x_max - x_min + 1, y_max - y_min + 1);
    }
    return 0;
}
