https://coderun.yandex.ru/problem/distance-to-root-mob Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.ArrayDeque

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val n = reader.readLine().toInt()
    val parentsInput = reader.readLine().split(" ").map { it.toInt() }

    val adj = List(n) { mutableListOf<Int>() }
    var directorId = -1

    for (i in 0 until n) {
        val managerInputIndex = parentsInput[i]
        if (managerInputIndex == 0) {
            directorId = i
        } else {
            val parentId = managerInputIndex - 1
            adj[parentId].add(i)
        }
    }

    val depths = IntArray(n) { -1 }
    val stack = ArrayDeque<Pair<Int, Int>>()

    if (directorId != -1) {
        depths[directorId] = 0
        stack.push(directorId to 0)

        while (stack.isNotEmpty()) {
            val (currentEmployee, currentDepth) = stack.pop()
            for (child in adj[currentEmployee]) {
                if (depths[child] == -1) {
                    depths[child] = currentDepth + 1
                    stack.push(child to currentDepth + 1)
                }
            }
        }
    }

    writer.write(depths.joinToString(" "))
    writer.newLine()
    reader.close()
    writer.close()
}