import
java.util.*;
class
Main {
static
void
addEdge(
int
a,
int
b, List<Integer>[] tree)
{
tree[a].add(b);
tree[b].add(a);
}
static
void
createTree(
int
n, List<Integer>[] tree)
{
for
(
int
i =
1
;; i++) {
int
c =
0
;
if
(
2
* i <= n) {
addEdge(i,
2
* i, tree);
c++;
}
if
(
2
* i +
1
<= n) {
addEdge(i,
2
* i +
1
, tree);
c++;
}
if
(c ==
0
)
break
;
}
}
static
void
bfs(
int
node, List<Integer>[] tree,
boolean
[] vis,
int
[] level,
List<Integer>[] nodes,
int
[] maxLevel)
{
Queue<
int
[]> qu =
new
LinkedList<>();
qu.add(
new
int
[] { node,
0
});
nodes[
0
].add(node);
vis[node] =
true
;
level[
1
] =
0
;
while
(!qu.isEmpty()) {
int
[] p = qu.poll();
vis[p[
0
]] =
true
;
for
(
int
child : tree[p[
0
]]) {
if
(!vis[child]) {
qu.add(
new
int
[] { child, p[
0
] });
level[child] = level[p[
0
]] +
1
;
maxLevel[
0
] = Math.max(maxLevel[
0
],
level[child]);
nodes[level[child]].add(child);
}
}
}
}
static
void
display(List<Integer>[] nodes,
int
maxLevel)
{
int
k =
0
, cycle =
0
;
while
(cycle -
1
<= maxLevel /
2
) {
while
(k < maxLevel - cycle) {
int
j = nodes[k].size() -
1
;
System.out.print(nodes[k].get(j - cycle)
+
" "
);
k++;
}
if
(k == maxLevel - cycle) {
int
j = nodes[k].size() -
1
;
for
(j -= cycle; j >= cycle; j--)
System.out.print(nodes[k].get(j) +
" "
);
}
k--;
while
(k > cycle) {
System.out.print(nodes[k].get(cycle) +
" "
);
k--;
}
cycle++;
k = cycle +
1
;
}
}
public
static
void
main(String[] args)
{
int
n =
12
;
List<Integer>[] tree =
new
List[
100000
];
for
(
int
i =
0
; i < tree.length; i++) {
tree[i] =
new
ArrayList<>();
}
boolean
[] vis =
new
boolean
[
100000
];
int
[] level =
new
int
[
100000
];
List<Integer>[] nodes =
new
List[
100000
];
for
(
int
i =
0
; i < nodes.length; i++) {
nodes[i] =
new
ArrayList<>();
}
int
[] maxLevel =
new
int
[
1
];
createTree(n, tree);
bfs(
1
, tree, vis, level, nodes, maxLevel);
display(nodes, maxLevel[
0
]);
}
}