Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.abs
// Функция для поиска ближайшего канонического значения с помощью бинарного поиска
fun findClosestCanonical(values: IntArray, query: Int): Int {
var left = 0
var right = values.size - 1
var best = values[0] // Изначально берем первый элемент как наилучший
while (left <= right) {
val mid = (left + right) / 2
// Обновляем наилучший вариант, если нашли более близкое значение
if (abs(values[mid] - query) < abs(best - query)) {
best = values[mid]
}
// Двигаемся в сторону уменьшения разницы
if (values[mid] < query) {
left = mid + 1
} else {
right = mid - 1
}
}
return best
}
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val n = reader.readLine().toInt() // Читаем количество канонических значений
val canonical = reader.readLine().split(" ").map { it.toInt() }.sorted().toIntArray() // Сортируем канонические значения
val m = reader.readLine().toInt() // Читаем количество запросов
// Для каждого запроса ищем ближайшее каноническое значение
repeat(m) {
val query = reader.readLine().toInt()
writer.write("${findClosestCanonical(canonical, query)}\\n")
}
writer.flush()
reader.close()
writer.close()
}