import sys
from collections import deque, defaultdict
def bfs(graph, start, visited):
queue = deque([(start, 0)])
visited.add(start)
max_depth = 0
while queue:
node, depth = queue.popleft()
max_depth = max(max_depth, depth)
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, depth + 1))
return max_depth
# Read the input from stdin
def read_input():
input = sys.stdin.read().splitlines()
idx = 0
graphs = []
while idx < len(input):
n = int(input[idx])
idx += 1
graph = defaultdict(list)
for i in range(n):
line = list(map(int, input[idx].split()))
graph[i] = line
idx += 1
graphs.append(graph)
return graphs
def process_graph(graph):
visited = set()
heights = []
for node in graph:
if node not in visited:
height = bfs(graph, node, visited)
heights.append(height)
return heights
input = sys.stdin.read().splitlines()
index = 0
graphs = []
while index < len(input):
n = int(input[index])
index+= 1
graph = defaultdict(list)
for i in range(n):
line = list(map(int, input[index].split()))
graph[i] = line
index += 1
graphs.append(graph)
results = []
for graph in graphs:
heights = process_graph(graph)
results.append(heights)
for heights in results:
print(" ".join(map(str, heights)))
aW1wb3J0IHN5cwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZSwgZGVmYXVsdGRpY3QKCgpkZWYgYmZzKGdyYXBoLCBzdGFydCwgdmlzaXRlZCk6CiAgICBxdWV1ZSA9IGRlcXVlKFsoc3RhcnQsIDApXSkKICAgIHZpc2l0ZWQuYWRkKHN0YXJ0KQogICAgbWF4X2RlcHRoID0gMAoKICAgIHdoaWxlIHF1ZXVlOgogICAgICAgIG5vZGUsIGRlcHRoID0gcXVldWUucG9wbGVmdCgpCiAgICAgICAgbWF4X2RlcHRoID0gbWF4KG1heF9kZXB0aCwgZGVwdGgpCgogICAgICAgIGZvciBuZWlnaGJvciBpbiBncmFwaFtub2RlXToKICAgICAgICAgICAgaWYgbmVpZ2hib3Igbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuZWlnaGJvcikKICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgobmVpZ2hib3IsIGRlcHRoICsgMSkpCgogICAgcmV0dXJuIG1heF9kZXB0aAoKCiMgUmVhZCB0aGUgaW5wdXQgZnJvbSBzdGRpbgpkZWYgcmVhZF9pbnB1dCgpOgogICAgaW5wdXQgPSBzeXMuc3RkaW4ucmVhZCgpLnNwbGl0bGluZXMoKQogICAgaWR4ID0gMAogICAgZ3JhcGhzID0gW10KCiAgICB3aGlsZSBpZHggPCBsZW4oaW5wdXQpOgogICAgICAgIG4gPSBpbnQoaW5wdXRbaWR4XSkKICAgICAgICBpZHggKz0gMQogICAgICAgIGdyYXBoID0gZGVmYXVsdGRpY3QobGlzdCkKCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgICAgIGxpbmUgPSBsaXN0KG1hcChpbnQsIGlucHV0W2lkeF0uc3BsaXQoKSkpCiAgICAgICAgICAgIGdyYXBoW2ldID0gbGluZQogICAgICAgICAgICBpZHggKz0gMQoKICAgICAgICBncmFwaHMuYXBwZW5kKGdyYXBoKQoKICAgIHJldHVybiBncmFwaHMKCgpkZWYgcHJvY2Vzc19ncmFwaChncmFwaCk6CiAgICB2aXNpdGVkID0gc2V0KCkKICAgIGhlaWdodHMgPSBbXQoKICAgIGZvciBub2RlIGluIGdyYXBoOgogICAgICAgIGlmIG5vZGUgbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgIGhlaWdodCA9IGJmcyhncmFwaCwgbm9kZSwgdmlzaXRlZCkKICAgICAgICAgICAgaGVpZ2h0cy5hcHBlbmQoaGVpZ2h0KQoKICAgIHJldHVybiBoZWlnaHRzCgoKaW5wdXQgPSBzeXMuc3RkaW4ucmVhZCgpLnNwbGl0bGluZXMoKQppbmRleCA9IDAKZ3JhcGhzID0gW10KCndoaWxlICBpbmRleCA8IGxlbihpbnB1dCk6CiAgICBuID0gaW50KGlucHV0W2luZGV4XSkKICAgIGluZGV4Kz0gMQogICAgZ3JhcGggPSBkZWZhdWx0ZGljdChsaXN0KQoKICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgIGxpbmUgPSBsaXN0KG1hcChpbnQsIGlucHV0W2luZGV4XS5zcGxpdCgpKSkKICAgICAgICBncmFwaFtpXSA9IGxpbmUKICAgICAgICBpbmRleCArPSAxCgogICAgZ3JhcGhzLmFwcGVuZChncmFwaCkKCnJlc3VsdHMgPSBbXQpmb3IgZ3JhcGggaW4gZ3JhcGhzOgogICAgaGVpZ2h0cyA9IHByb2Nlc3NfZ3JhcGgoZ3JhcGgpCiAgICByZXN1bHRzLmFwcGVuZChoZWlnaHRzKQoKZm9yIGhlaWdodHMgaW4gcmVzdWx0czoKICAgIHByaW50KCIgIi5qb2luKG1hcChzdHIsIGhlaWdodHMpKSk=