#include "dungeon2.h"
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
int counter=0, depth[205], vect[205], twok[205][20], mult=1;
vector<int> graph[205], pd[205], adj[205];
void dfs(int node, int p, int d){
int par=LastRoad();
if (Color()!=1){
--counter;
Move(par, Color());
return;
}
twok[node][0]=node;
for (int i=1; i<20; ++i)twok[node][i]=twok[twok[node][i-1]][i-1];
depth[node]=d;
pd[node].resize(NumberOfRoads()+1, 0);
for (int i=1; i<=NumberOfRoads(); ++i){
if (i==par){
if (p!=node)graph[node].pb(p);
}
else{
int temp=counter;
Move(i, 2);
dfs(++counter, node, d+1);
if (temp==counter)graph[node].pb(-1);
else graph[node].pb(temp+1);
}
}
if (par!=-1)Move(par, 3);
}
void dfs2(int node){
int par=LastRoad();
for (int i=1; i<=NumberOfRoads(); ++i)if (i!=par){
if (graph[node][i-1]==-1){
Move(i, vect[node]);
pd[node][i]+=mult*(Color()-1);
Move(LastRoad(), Color());
}
else Move(i, vect[node]), dfs2(graph[node][i-1]);
}
if (par!=-1)Move(par, vect[node]);
}
void Inspect(int R){
dfs(0, 0, 0);
for (int b=0; b<5; ++b, mult*=3){
for (int i=0; i<=counter; ++i)vect[i]=depth[i]%3+1, depth[i]/=3;
dfs2(0);
}
for (int i=0; i<=counter; ++i)for (int j=0; j<graph[i].size(); ++i){
if (graph[i][j]==-1)adj[i].pb(pd[i][j+1]);
else adj[i].pb(graph[i][j]);
}
vector<int> ans(counter+1, 0);
for (int i=0; i<=counter; ++i){
queue<int> q;
vector<int> dj(counter+1, -1);
dj[i]=0;
q.push(i);
while (q.size()){
int node=q.front();
q.pop();
for (auto num:adj[node])if (dj[num]==-1)dj[num]=dj[node]+1, q.push(num);
}
for (int j=0; j<=counter; ++j)++ans[dj[j]];
}
for (int i=1; i<=R; ++i)Answer(i, ans[i]);
}