#include <cstdio>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <stack>
#include <climits>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
double EPS=1e-10;
double EQ(double a,double b){
  return abs(a-b)<EPS;
}

/*
  // 3がfront
  1 // top
  3 2 4 5
  6 // botom
*/
// 回転配列
// 使用法はsetFaceでの回転参照
int leftR[]={0,2,6,3,4,1,5};
int rightR[]={0,5,1,3,4,6,2};
int frontR[]={0,4,2,1,6,5,3};
int backR[]={0,3,2,6,1,5,4};
// z軸を中心に右回転
int rotateRight[]={0,1,3,5,2,4,6};
// z軸を中心に左回転
int rotateLeft[]={0,1,4,2,5,3,6};
// 回転させてマッチするfaceを探す
// curFaceに結果を代入
void setFace(int *curFace,int front,int top){
  int tmpFaces[]={0,1,2,3,4,5,6};
  int nTmpFaces[10];
  for(int i=0;i<4;i++){
    for(int k=0;k<4;k++){
      // ここで判定
      if(tmpFaces[1]==top&&tmpFaces[3]==front){
	for(int m=1;m<=6;m++)curFace[m]=tmpFaces[m];
	return;
      }
      // z軸を中心に右回転させる
      for(int l=1;l<=6;l++)nTmpFaces[l]=tmpFaces[rotateRight[l]];
      // 回転結果をtmpFaceに反映
      for(int l=1;l<=6;l++)tmpFaces[l]=nTmpFaces[l];
    }
    // 左へサイコロを倒す
    for(int l=1;l<=6;l++)nTmpFaces[l]=tmpFaces[leftR[l]];
    // 回転結果をtmpFaceに反映
    for(int l=1;l<=6;l++)tmpFaces[l]=nTmpFaces[l];
  }
  for(int i=0;i<3;i++){
    // 前へサイコロを倒す
    for(int l=1;l<=6;l++)nTmpFaces[l]=tmpFaces[frontR[l]];
    // 回転結果をtmpFaceに反映
    for(int l=1;l<=6;l++)tmpFaces[l]=nTmpFaces[l];
    if(i==1)continue;
    for(int k=0;k<4;k++){
      // ここで判定
      if(tmpFaces[1]==top&&tmpFaces[3]==front){
	for(int m=1;m<=6;m++)curFace[m]=tmpFaces[m];
	return;
      }
      // z軸を中心に右回転させる
      for(int l=1;l<=6;l++)nTmpFaces[l]=tmpFaces[rotateRight[l]];
      // 回転結果をtmpFaceに反映
      for(int l=1;l<=6;l++)tmpFaces[l]=nTmpFaces[l];
    }
  }
}

pii field[1001][1001];
const int dy[]={0,0,0,-1,1,0};
const int dx[]={0,0,1,0,0,-1};

int main(){

  int n;
  while(cin>>n&&n){
    for(int i=0;i<1001;i++)
      for(int j=0;j<1001;j++){
	field[i][j].first=0;
	field[i][j].second=-1;
      }
    pii cur=pii(500,500);
    for(int p=1;p<=n;p++){
      int f,t;
      cin>>t>>f;
      int curFace[10];
      setFace(curFace,f,t);
      int cy=cur.first;
      int cx=cur.second;
      while(1){
	int candAng=-1;
	int candVal=-1;
	for(int i=1;i<=6;i++){
	  if(i>=2&&i<=5&&curFace[i]>=4){
	    int ny=cy+dy[i];
	    int nx=cx+dx[i];
	    if(field[ny][nx].first<field[cy][cx].first){
	      if(candVal<curFace[i]){
		candVal=curFace[i];
		candAng=i;
	      }
	    }
	  }
	}
	if(candAng==-1){
	  field[cy][cx].first++;
	  field[cy][cx].second=curFace[1];
	  break;
	}
	else{
	  int ny=cy+dy[candAng];
	  int nx=cx+dx[candAng];
	  cy=ny;cx=nx;
	  int nxtFace[10];
	  // それぞれの方向へ回転
	  if(candAng==4)
	    for(int i=0;i<10;i++)nxtFace[i]=curFace[backR[i]];
	  else if(candAng==5)
	    for(int i=0;i<10;i++)nxtFace[i]=curFace[leftR[i]];
	  else if(candAng==3)
	    for(int i=0;i<10;i++)nxtFace[i]=curFace[frontR[i]];
	  else if(candAng==2)
	    for(int i=0;i<10;i++)nxtFace[i]=curFace[rightR[i]];
	  for(int i=0;i<10;i++)curFace[i]=nxtFace[i];
	}
      }
    }
    int cnts[101];
    memset(cnts,0,sizeof(cnts));
    for(int i=0;i<1000;i++)
      for(int j=0;j<1000;j++)
	if(field[i][j].second!=-1)
	  cnts[field[i][j].second]++;
    for(int i=1;i<=6;i++){
      cout<<cnts[i];
      if(i==6)cout<<endl;
      else cout<<" ";
    }
  }

  return 0;
}

Measured memory_bytes: 8700