https://coderun.yandex.ru/problem/pallets Средняя

Решение

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

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

    val n = reader.readLine().toInt()
    val deliveryIdList = reader.readLine().split(" ").map { it.toInt() }
    val parentIdList = reader.readLine().split(" ").map { it.toInt() }
    val k = reader.readLine().toInt()
    val undeliveredSet = HashSet<Int>()
    if (k > 0) {
        val undeliveredList = reader.readLine().split(" ").map { it.toInt() }
        undeliveredSet.addAll(undeliveredList)
    }

    val isShippable = BooleanArray(n + 1) { true }
    val queue = ArrayDeque<Int>()
    for (i in 1..n) {
        if (deliveryIdList[i - 1] in undeliveredSet) {
            if (isShippable[i]) {
                isShippable[i] = false
                queue.addLast(i)
            }
        }
    }

    while (queue.isNotEmpty()) {
        val currentItemIndex = queue.removeFirst()
        val parentItemIndex = parentIdList[currentItemIndex - 1]
        if (parentItemIndex != 0 && isShippable[parentItemIndex]) {
            isShippable[parentItemIndex] = false
            queue.addLast(parentItemIndex)
        }
    }

    val resultPallets = ArrayList<Int>()
    for (i in 1..n) {
        if (parentIdList[i - 1] == 0 && isShippable[i]) {
            resultPallets.add(i)
        }
    }

    writer.write(resultPallets.size.toString())
    writer.newLine()
    if (resultPallets.isNotEmpty()) {
        writer.write(resultPallets.joinToString(" "))
        writer.newLine()
    }

    reader.close()
    writer.flush()
    writer.close()
}