https://coderun.yandex.ru/problem/questions-about-maximum Сложная

Решение

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

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.`out`))

    val (n, q) = reader.readLine().split(' ').let { it[0].toInt() to it[1].toInt() }

    val sizeTree = 4 * n + 5
    val treeOps = Array<MutableList<Int>>(sizeTree) { mutableListOf() }

    fun addOp(node: Int, l: Int, r: Int, ql: Int, qr: Int, x: Int) {
        if (ql <= l && r <= qr) {
            treeOps[node].add(x)
        } else {
            val mid = (l + r) shr 1
            if (ql <= mid) addOp(node * 2, l, mid, ql, qr, x)
            if (qr >  mid) addOp(node * 2 + 1, mid + 1, r, ql, qr, x)
        }
    }

    repeat(q) {
        val parts = reader.readLine().split(' ')
        val l = parts[0].toInt()
        val r = parts[1].toInt()
        val x = parts[2].toInt()
        addOp(1, 1, n, l, r, x)
    }

    val sizeBits = n + 1
    val B = (sizeBits + 63) / 64
    val globalResult = LongArray(B) { 0L }

    fun bitsetOrShift(dp: LongArray, shift: Int) {
        val nWords = dp.size
        val wordShift = shift / 64
        if (wordShift >= nWords) return
        val bitShift = shift % 64
        if (bitShift == 0) {
            for (i in nWords - 1 downTo wordShift) {
                dp[i] = dp[i] or dp[i - wordShift]
            }
        } else {
            for (i in nWords - 1 downTo wordShift + 1) {
                dp[i] = dp[i] or
                    (dp[i - wordShift] shl bitShift) or
                    (dp[i - wordShift - 1].ushr(64 - bitShift))
            }
            dp[wordShift] = dp[wordShift] or (dp[0] shl bitShift)
        }
    }

    fun dfs(node: Int, l: Int, r: Int, dp: LongArray) {
        val cur = dp.clone()
        for (x in treeOps[node]) {
            bitsetOrShift(cur, x)
        }
        if (l == r) {
            for (i in 0 until B) {
                globalResult[i] = globalResult[i] or cur[i]
            }
        } else {
            val mid = (l + r) shr 1
            dfs(node * 2,     l,    mid, cur)
            dfs(node * 2 + 1, mid+1, r,   cur)
        }
    }

    val initDP = LongArray(B) { 0L }
    initDP[0] = 1L

    dfs(1, 1, n, initDP)

    val answer = mutableListOf<Int>()
    for (m in 1..n) {
        val word = m ushr 6
        val bit  = m and 63
        if ((globalResult[word].ushr(bit) and 1L) != 0L) {
            answer.add(m)
        }
    }

    writer.write("${answer.size}\\n")
    if (answer.isNotEmpty()) {
        writer.write(answer.joinToString(" "))
        writer.newLine()
    }
    writer.flush()
    reader.close()
    writer.close()
}