#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <cassert>
#include <string>
#include <memory.h>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <map>
#include <cctype>
#include <iomanip>
#include <sstream>
#include <cctype>
#include <fstream>
#include <cmath>
using namespace std;

#define REP2(i, m, n) for(int i = (int)(m); i < (int)(n); i++)
#define REP(i, n) REP2(i, 0, n)
#define ALL(c) (c).begin(), (c).end()
#define ITER(c) __typeof((c).begin())
#define PB(e) push_back(e)
#define FOREACH(i, c) for(ITER(c) i = (c).begin(); i != (c).end(); ++i)
#define MP(a, b) make_pair(a, b)
#define PARITY(n) ((n) & 1)

typedef long long ll;
typedef pair<ll, ll> P;
const int INF = 1000 * 1000 * 1000 + 7;
const double EPS = 1e-10;

const int sz = 210;
int height[sz][sz];
int number[sz][sz];

enum{
  TOP,
  BOTTOM,
  LEFT,
  RIGHT,
  FRONT,
  BACK
};

vector<int> init_dice(int top, int front){
  vector<int> dice(6);

  int L[6][6] = {
    {-1, 3, 1, 4, 2,-1},
    {2 ,-1, 5, 0,-1, 3},
    {4 , 0,-1,-1, 5, 1},
    {1 , 5,-1,-1, 0, 4},
    {3 ,-1, 0, 5,-1, 2},
    {-1, 2, 4, 1, 3,-1},
  };
  
  dice[TOP]    = top;
  dice[BOTTOM] = 5 - top;
  dice[LEFT]   = L[top][front];
  dice[RIGHT]  = 5 - dice[LEFT];
  dice[FRONT]  = front;
  dice[BACK]   = 5 - front;
  return dice;
}

void rotx(vector<int> &dice){
  int tmp      = dice[RIGHT];
  dice[RIGHT]  = dice[TOP];
  dice[TOP]    = dice[LEFT];
  dice[LEFT]   = dice[BOTTOM];
  dice[BOTTOM] = tmp;
}

void roty(vector<int> &dice){
  int tmp      = dice[FRONT];
  dice[FRONT]  = dice[TOP];
  dice[TOP]    = dice[BACK];
  dice[BACK]   = dice[BOTTOM];
  dice[BOTTOM] = tmp;
}

  

bool fall(int &x, int &y, vector<int> &dice){
  int dx[4] = {0, 1, 0, -1};
  int dy[4] = {1, 0, -1, 0};
  int face[4] = {FRONT, RIGHT, BACK, LEFT};

  int dir = -1;
  REP(i, 4){
    int x2 = x + dx[i];
    int y2 = y + dy[i];
    if(height[x][y] > height[x2][y2] && dice[face[i]] >= 3){
      if(dir == -1 || dice[face[dir]] < dice[face[i]]) dir = i;
    }
  }

  if(dir == -1) return false;
  
  x += dx[dir];
  y += dy[dir];
  if(dir == 0) roty(dice);
  if(dir == 1) rotx(dice);
  if(dir == 2) roty(dice), roty(dice), roty(dice);
  if(dir == 3) rotx(dice), rotx(dice), rotx(dice);
  return true;
}

int main(){
  int n, f, t;
  while(cin >> n && n){
    memset(height, 0, sizeof(height));
    memset(number, 0, sizeof(number));
      
    REP(i, n){
      cin >> t >> f;
      t--, f--;
      vector<int> dice = init_dice(t, f);
      int x = sz / 2;
      int y = sz / 2;
      while(fall(x, y, dice));
      height[x][y]++;
      number[x][y] = dice[TOP];
    }
    
    vector<int> res(6, 0);
    REP(i, sz)REP(j, sz) if(height[i][j] > 0) res[number[i][j]]++;
    REP(i, 6) cout << res[i] << (i == 5 ? '\n' : ' ');
    
  }
  return 0;
}