https://coderun.yandex.ru/problem/art-power Легкая

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.min

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

    val firstLine = reader.readLine().split(" ")
    val m = firstLine[1].toInt()
    val a = reader.readLine().split(" ").map { it.toInt() }

    val nonZeros = mutableListOf<Pair<Int, Long>>()
    for (i in 0 until m) {
        if (a[i] > 0) {
            nonZeros.add(Pair(i, a[i].toLong()))
        }
    }
    val nzCount = nonZeros.size

    val nzPrefixSum = LongArray(nzCount + 1) { 0L }
    for (k in 0 until nzCount) {
        nzPrefixSum[k + 1] = nzPrefixSum[k] + nonZeros[k].second
    }

    var totalScore = 0L
    var nzPtr = 0

    for (i in 0 until m) {
        val currentScoreInt = a[i]
        if (currentScoreInt == 0) continue
        val currentScoreLong = currentScoreInt.toLong()
        totalScore += currentScoreLong * currentScoreLong
        if (i < m - 1) {
            while (nzPtr < nzCount && nonZeros[nzPtr].first <= i) {
                nzPtr++
            }
            val startNzBonusIndex = nzPtr
            val count = currentScoreInt
            val endNzBonusIndex = min(startNzBonusIndex + count, nzCount)
            if (startNzBonusIndex < endNzBonusIndex) {
                val bonus = nzPrefixSum[endNzBonusIndex] - nzPrefixSum[startNzBonusIndex]
                totalScore += bonus
            }
        }
    }

    writer.write(totalScore.toString())
    writer.newLine()
    reader.close()
    writer.close()
}