#include <bits/stdc++.h>
#include "dungeon.h"
using namespace std;
#define pii pair<int,int>
vector<int> do_wym[203];
vector<pii> graph[203];
vector<pii> sciezki[203][203];
int matrix[203][203];
int dp[203][203];
int wyn[203];
pii fat[203];
int deg[203];
int wolne=0;
void dfs(int v, int p){
if (v!=1){
fat[v]={LastRoad(),p};
do_wym[v][LastRoad()]=p;
}
deg[v]=NumberOfRoads();
do_wym[v].resize(deg[v]+1);
for (int i = 1; i<=deg[v]; i++){
Move(i,2);
if (Color()==2)Move(LastRoad(),2);
else{
do_wym[v][i]=++wolne;
graph[v].push_back({wolne,i});
dfs(wolne,v);
}
}
if (v!=1)Move(fat[v].first,2);
}
bool build_sciezka(int v, int p, int a, int b){
if (v==b)return true;
for (auto u : graph[v]){
if (v==p)continue;
sciezki[a][b].push_back(u);
if (build_sciezka(u.first,v,a,b))return true;
sciezki[a][b].pop_back();
}
return false;
}
void MyMove(int a, int b){
if (a==b)return;
Move(sciezki[a][b][0].second,Color());
for (int i = 1; i<sciezki[a][b].size(); i++){
Move(sciezki[a][b][i].second,Color());
}
}
void Inspect(int R){
dfs(++wolne,0);
int n=wolne;
for (int i = 1; i<=n; i++){
for (int j = 1; j<=n; j++){
build_sciezka(i,0,i,j);
}
}
int cur=1;
for (int i = 1; i<=n; i++){
MyMove(cur,i);
cur=i;
Move(1,3);
Move(LastRoad(),1);
for (int j = i+1; j<=n; j++){
MyMove(cur,j);
cur=j;
for (int u = 1; u<=deg[cur]; u++){
if (do_wym[cur][u])continue;
Move(u,1);
if (Color()==3){
matrix[i][j]=matrix[j][i]=1;
Move(LastRoad(),3);
}
else Move(LastRoad(),1);
}
}
MyMove(cur,i);
Move(1,1);
Move(LastRoad(),1);
}
for (int i = 1; i<=n; i++){
for (auto u : graph[i])matrix[i][u.first]=matrix[u.first][i]=1;
}
for (int i = 1; i<=n; i++){
for (int j = 1; j<=n; j++){
dp[i][j]=n+2;
if (i==j)dp[i][j]=0;
if (matrix[i][j])dp[i][j]=matrix[i][j];
}
}
for (int k = 1; k<=n; k++){
for (int i = 1; i<=k; i++){
for (int j = 1; j<=k; j++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
for (int i = 1; i<=n; i++){
for (int j = i+1; j<=n; j++){
wyn[dp[i][j]]++;
}
}
for (int i = 1; i<=R; i++){
Answer(i,wyn[i]);
}
}