enum class VarEdge() { DECREASING, STATIC, INCREASING; companion object { fun getEdgeFrom(before: Int, ahead: Int): VarEdge { return if (before - ahead > 0) { DECREASING } else if (before - ahead == 0) { STATIC } else { INCREASING } } } } fun getCountZigzagSubarray(arr: List): Long { val arrEdges = arr.slice(0 until arr.size - 1).zip(arr.slice(1 until arr.size)).map { (before, ahead) -> VarEdge.getEdgeFrom(before, ahead) } val intervals: MutableList> = mutableListOf() var last = -1 var beforeEdge = VarEdge.STATIC arrEdges.withIndex().forEach { (index, edge) -> if (edge == VarEdge.DECREASING) { if (beforeEdge == VarEdge.INCREASING) { } else if (beforeEdge == VarEdge.STATIC) { last = index } else { intervals.add(Pair(last, index)) last = index } } else if (edge == VarEdge.INCREASING) { if (beforeEdge == VarEdge.DECREASING) { } else if (beforeEdge == VarEdge.STATIC) { last = index } else { intervals.add(Pair(last, index)) last = index } } else { if (beforeEdge != VarEdge.STATIC) { intervals.add(Pair(last, index)) last = index } } beforeEdge = edge } if (beforeEdge != VarEdge.STATIC) { intervals.add(Pair(last, arr.size - 1)) } return intervals.sumOf { val n = (it.second - it.first).toLong() (n) * (n + 1) / 2 } } fun main() = with(System.`in`.bufferedReader()) { val t = this.readLine().toInt() repeat(t) { this.readLine() val arr = this.readLine().split(' ').map { it.toInt() } println(getCountZigzagSubarray(arr)) } }