https://coderun.yandex.ru/problem/median-union-2 Средняя

Решение

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

fun countLessThanOrEqual(arr: LongArray, value: Long): Int {
    var low = 0
    var high = arr.size
    var count = 0
    while (low < high) {
        val mid = low + (high - low) / 2
        if (arr[mid] <= value) {
            count = mid + 1
            low = mid + 1
        } else {
            high = mid
        }
    }
    return count
}

fun generateSequence(L: Int, x1_in: Long, d1_in: Long, a_in: Long, c_in: Long, m_in: Long): LongArray {
    val sequence = LongArray(L)
    val d = LongArray(L)
    sequence[0] = x1_in
    if (L > 0) {
        d[0] = d1_in
    }
    for (i in 1 until L) {
        d[i] = (a_in * d[i - 1] + c_in) % m_in
        sequence[i] = sequence[i - 1] + d[i - 1]
    }
    return sequence
}

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    var tokenizer = StringTokenizer(reader.readLine())
    val n = tokenizer.nextToken().toInt()
    val l = tokenizer.nextToken().toInt()
    val sequences = mutableListOf<LongArray>()
    repeat(n) {
        tokenizer = StringTokenizer(reader.readLine())
        val x1 = tokenizer.nextToken().toLong()
        val d1 = tokenizer.nextToken().toLong()
        val a = tokenizer.nextToken().toLong()
        val c = tokenizer.nextToken().toLong()
        val m = tokenizer.nextToken().toLong()
        sequences.add(generateSequence(l, x1, d1, a, c, m))
    }
    for (i in 0 until n) {
        for (j in i + 1 until n) {
            val seq1 = sequences[i]
            val seq2 = sequences[j]
            var lowMedian: Long = -1_000_000_001L
            var highMedian: Long = 1_000_000_001L
            var resultMedian: Long = highMedian
            while (lowMedian <= highMedian) {
                val mid = lowMedian + (highMedian - lowMedian) / 2
                val count1 = countLessThanOrEqual(seq1, mid)
                val count2 = countLessThanOrEqual(seq2, mid)
                val totalCount = count1 + count2
                if (totalCount >= l) {
                    resultMedian = mid
                    highMedian = mid - 1
                } else {
                    lowMedian = mid + 1
                }
            }
            writer.write(resultMedian.toString())
            writer.newLine()
        }
    }
    writer.flush()
}