https://coderun.yandex.ru/problem/forward-to-the-past/description Сложная

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.time.LocalDate
import java.time.format.DateTimeFormatter

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    val N = reader.readLine()!!.toInt()
    val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
    val startDate = LocalDate.of(1970, 1, 1)
    val endDate = LocalDate.of(2020, 12, 31)
    var startEpoch = startDate.toEpochDay()
    var endEpoch = endDate.toEpochDay()
    writer.write("? ${endDate.format(formatter)}")
    writer.newLine()
    writer.flush()
    var resp = reader.readLine()!!
    if (resp.first() == '!') return
    val total = resp.split(' ')[1].toLong()
    val targetPos = (total + 1) / 2
    var answerEpoch = startEpoch
    while (startEpoch <= endEpoch) {
        val mid = (startEpoch + endEpoch) / 2
        val midDate = LocalDate.ofEpochDay(mid).format(formatter)
        writer.write("? $midDate")
        writer.newLine()
        writer.flush()
        resp = reader.readLine() ?: break
        if (resp.first() == '!') return
        val k = resp.split(' ')[1].toLong()
        if (k >= targetPos) {
            answerEpoch = mid
            endEpoch = mid - 1
        } else {
            startEpoch = mid + 1
        }
    }
    val answer = LocalDate.ofEpochDay(answerEpoch).format(formatter)
    writer.write("! $answer")
    writer.newLine()
    writer.flush()
}