#include<iostream>
#include<cmath>
#include<vector>
#include<initializer_list>
#include<algorithm>
#include<functional>

using namespace std;
typedef pair<int, int> Pi;

vector<vector<int>> retmap(){
	vector<vector<int>> ret;
	ret.resize(250);
	for (int i = 0; i < 250; i++)ret[i].resize(250);
	return ret;
}

int N, geta = 130;
int overview[150][250][250];

int saikoro[7][7][6];

void initialize(int t, int f) {
	//f...0  t...1

	//北方向に倒す
	if (saikoro[f][saikoro[t][f][5]][0] == 0) {
		//未着手ならば
		saikoro[f][saikoro[t][f][5]][0] = f;
		saikoro[f][saikoro[t][f][5]][1] = saikoro[t][f][5];
		saikoro[f][saikoro[t][f][5]][2] = saikoro[t][f][2];//変わらない
		saikoro[f][saikoro[t][f][5]][3] = t;
		saikoro[f][saikoro[t][f][5]][4] = saikoro[t][f][4];//変わらない
		saikoro[f][saikoro[t][f][5]][5] = saikoro[t][f][3];

		initialize(f, saikoro[t][f][5]);
	}
	
	//南方向に倒す
	if (saikoro[saikoro[t][f][3]][t][0] == 0) {
		//未着手ならば
		saikoro[saikoro[t][f][3]][t][0] = saikoro[t][f][3];
		saikoro[saikoro[t][f][3]][t][1] = f;
		saikoro[saikoro[t][f][3]][t][2] = saikoro[t][f][2];//変わらない
		saikoro[saikoro[t][f][3]][t][3] = saikoro[t][f][5];
		saikoro[saikoro[t][f][3]][t][4] = saikoro[t][f][4];//変わらない
		saikoro[saikoro[t][f][3]][t][5] = t;

		initialize(saikoro[t][f][3], f);
	}

	//東方向に倒す
	if (saikoro[saikoro[t][f][4]][f][0] == 0) {
		//未着手ならば
		saikoro[saikoro[t][f][4]][f][0] = saikoro[t][f][4];
		saikoro[saikoro[t][f][4]][f][1] = f;//変わらない
		saikoro[saikoro[t][f][4]][f][2] = t;
		saikoro[saikoro[t][f][4]][f][3] = saikoro[t][f][3];//変わらない
		saikoro[saikoro[t][f][4]][f][4] = saikoro[t][f][5];
		saikoro[saikoro[t][f][4]][f][5] = saikoro[t][f][2];

		initialize(saikoro[t][f][4], f);
	}

	//西方向に倒す
	if (saikoro[saikoro[t][f][2]][f][0] == 0) {
		//未着手ならば
		saikoro[saikoro[t][f][2]][f][0] = saikoro[t][f][2];
		saikoro[saikoro[t][f][2]][f][1] = f;//変わらない
		saikoro[saikoro[t][f][2]][f][2] = saikoro[t][f][5];
		saikoro[saikoro[t][f][2]][f][3] = saikoro[t][f][3];//変わらない
		saikoro[saikoro[t][f][2]][f][4] = t;
		saikoro[saikoro[t][f][2]][f][5] = saikoro[t][f][4];

		initialize(saikoro[t][f][2], f);
	}
}

void dropsaikoro(int x, int y, int t, int f, int h) {

	//一番下に落ちた場合
	if (h == 0) {
		overview[h][x][y] = t;
		return;
	}

	//下に何もない場合、そのまま一つ落ちる
	if (overview[h - 1][x][y] == 0) {
		dropsaikoro(x, y, t, f, h - 1);
		return;
	}

	//これ以降はh>=1、かつ下になにかあり、倒れるかそのまま落ち着くかのいずれかになる。
	vector<pair<int, int>> candidate;
	//北に転がるとき
	if (overview[h][x][y + 1] == 0 && overview[h - 1][x][y + 1] == 0) {
		candidate.push_back(Pi(saikoro[t][f][3], 3));
	}
	//南に転がるとき
	if (overview[h][x][y - 1] == 0 && overview[h - 1][x][y - 1] == 0) {
		candidate.push_back(Pi(saikoro[t][f][1], 1));
	}
	//西に転がるとき
	if (overview[h][x - 1][y] == 0 && overview[h - 1][x - 1][y] == 0) {
		candidate.push_back(Pi(saikoro[t][f][2], 2));
	}
	//東に転がるとき
	if (overview[h][x + 1][y] == 0 && overview[h - 1][x + 1][y] == 0) {
		candidate.push_back(Pi(saikoro[t][f][4], 4));
	}

	if (candidate.size() == 0) {
		//転がれる場所の候補がない

	end:;

		overview[h][x][y] = t;
		return;
	}
	sort(candidate.begin(), candidate.end(), greater<Pi>());
	
	//4, 5, 6以外がないのならばそこで止まる
	if (candidate[0].first <= 3)goto end;

	int nextd = candidate[0].second;
	int vx[5] = { -114514, 0, -1, 0, 1 }, vy[5] = { -114514, -1, 0, 1, 0 };
	
	if (nextd == 1) {
		//南
			dropsaikoro(x + vx[nextd], y + vy[nextd], saikoro[t][f][3], t, h - 1);
	}
	else 
		if (nextd == 2) {
		//東
			dropsaikoro(x + vx[nextd], y + vy[nextd], saikoro[t][f][4], f, h - 1);
	}
	else 
		if(nextd == 3) {
		//北
			dropsaikoro(x + vx[nextd], y + vy[nextd], f, saikoro[t][f][5], h - 1);
	}
	else 
		if(nextd == 4) {
		//西
			dropsaikoro(x + vx[nextd], y + vy[nextd], saikoro[t][f][2], f, h - 1);
	}
	
}

int main() {
	
	{
		saikoro[1][3][0] = 1;
		saikoro[1][3][1] = 3;
		saikoro[1][3][2] = 5;
		saikoro[1][3][3] = 4;
		saikoro[1][3][4] = 2;
		saikoro[1][3][5] = 6;
	}
	initialize(1, 3);
	
	while (1) {
		cin >> N;
		if (N == 0)break;
		for (int i = 0; i < N; i++) {
			int t, f;
			cin >> t >> f;
			dropsaikoro(0 + geta, 0 + geta, t, f, 110);
		}

		bool used[250][250] = {};
		int ans[7] = {};
		for (int i = 100; i >= 0; i--) {
			for (int j = 0; j < 250; j++) {
				for (int k = 0; k < 250; k++) {
					if (overview[i][j][k] >= 1 && !used[j][k]) {
						used[j][k] = true;
						ans[overview[i][j][k]]++;
					}		
					//ついでにoverviewの初期化もする
					overview[i][j][k] = 0;
				}
			}
		}

		for (int i = 1; i <= 5; i++)cout << ans[i] << " ";
		cout << ans[6] << endl;

	}
	
	return 0;
}


Measured memory_bytes: 27848