#include <cstdio>
#include <utility>
#include <cctype>
#include <array>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

#ifdef __linux
#define _U(s) s##_unlocked
#else
#define _U(s) _##s##_nolock
#define _CRT_DISABLE_PERFCRIT_LOCKS
#endif
#define gcu _U(getchar)
#define pcu _U(putchar)
#define _DEF(r, n, ...) inline r n(__VA_ARGS__) noexcept
#define _T template <typename T>
#define _HT template <typename H,typename... T>
#define _OP(t) inline operator t()
struct _in {
#ifdef _GLIBCXX_STRING
	_OP(string){string s;char c;while(isspace(c = gcu()));do{s+=c;}while(c=gcu(),c!=' '&&c!='\n'&&c!=EOF);return s;}
#define _S
#endif
	_OP(char){char c=gcu();gcu();return c;}
	_OP(double){double d; scanf("%lf",&d); gcu();return d;}
	_T _OP(T){T n{},m{1},c;while(isspace(c = gcu()));if(c=='-')m=-1,c=gcu();do{n=10*n+(c-'0'),c=gcu();}while(c>='0'&&c<='9');return m*n;}
} in;
#define _SCAN(...) _DEF(bool,scan,__VA_ARGS__)
#ifdef _S
_SCAN(string &o) {int c{gcu()};if(c==EOF)return false;else{ungetc(c,stdin);string t=move(in);o=t;return true;}}
#endif
_T _SCAN(T &o) {int c{gcu()};return c==EOF?false:(ungetc(c,stdin),o=in,true);}
_HT _SCAN(H &h,T&&... t){return scan(h)&&scan(t...);}
#define _OUT(...) _DEF(void,out,__VA_ARGS__)
#define _OUTL(...) _DEF(void,outl,__VA_ARGS__)
_OUT(bool b){pcu('0'+b);}
_OUT(const char *s){while(*s)pcu(*s++);}
_OUT(char c){pcu(c);}
#ifdef _S
_OUT(string &s){for(char c:s)pcu(c);}
#endif
_T _OUT(T n){static char b[20];char *p=b;T m=n<0?pcu('-'),-1:1;
	if(!n)*p++='0';else while(n)*p++=(char)(n%10*m+'0'),n/=10;while(p!=b)pcu(*--p);}
_OUTL(){out('\n');}
#ifdef _GLIBCXX_VECTOR
	_T _OUT(vector<T> &v){for(T &x:v)out(&x == &v[0]?"":" "),out(x);}
#endif
_HT _OUT(H &&h, T... t){out(h);out(t...);}
template <typename... T> _OUTL(T... t){out(t...);outl();}
#define dbg(...) fprintf(stderr,__VA_ARGS__);
struct range{
	int e,b=0,s=1;range(int b,int e,int s):e(e),b(b),s(s){} range(int b,int e): e(e), b(b){} range(int e):e(e){}
	struct it{int v,s; it(int v,int s):v(v),s(s){} operator int()const{return v;} operator int&(){return v;}int operator*()const{return v;}
		it& operator++(){v+=s;return *this;} }; it begin(){return {b,s};} it end(){return {e,s};}};
#define times(i,n) for(int i=n;i;i--)

_T using V = vector<T>;
using A = array<int, 6>;
using AA = array<A, 6>;

enum {X = -1};
AA r {
	X, 3, 1, 4, 2, X,
	2, X, 5, 0, X, 3,
	4, 0, X, X, 5, 1,
	1, 5, X, X, 0, 4,
	3, X, 0, 5, X, 2,
	X, 2, 4, 1, 3, X
};

struct D {
	int f, h;
	bool operator < (D a) const {
		return f < a.f;
	}
};

int main() {
	V<V<V<int>>> rot(6, V<V<int>>(6));
	for (int f: range(6))
		for (int t: range(6)) {
			if (f != t && f + t != 5) {
				V<D> a(4);
				a[0] = {5 - f, 0}, a[1] = {r[f][t], 1}, a[2] = {f, 2}, a[3] = {5 - r[f][t], 3};
				sort(rbegin(a), rend(a));
				for (auto i: a)
					if (i.f > 2)
						rot[f][t].push_back(i.h);
			}
		}
	int dx[] {0, 1, 0, -1}, dy[] {-1, 0, 1, 0};
	for (int n; (n = in);) {
		A res{};
		V<V<D>> d(100, V<D>(100, {X, 0}));
		for (;n--;) {
			int t {in}, f {in}, x {50}, y {50};
			function<void(int, int)> roll = [&](int t, int f) {
				for (int i: rot[f][t])
					if (d[y + dy[i]][x + dx[i]].h < d[y][x].h) {
						x += dx[i], y += dy[i];
						if (i == 0)
							roll(f, 5 - t);
						else if(i == 1)
							roll(5 - r[f][t], f);
						else if(i == 2)
							roll(5 - f, t);
						else
							roll(r[f][t], f);
						return;
					}
				D &o = d[y][x];
				if (o.f != X)
					res[o.f]--;
				res[t]++;
				o = {t, o.h + 1};
				return;
			};
			roll(t - 1, f - 1);
		}
		for (int &i: res)
			out(&i == &res[0]?"":" ", i);
		outl();
	}
}


Measured memory_bytes: 2756