|  | @@ -0,0 +1,56 @@
 | 
	
		
			
				|  |  | +package main
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"container/heap"
 | 
	
		
			
				|  |  | +	"fmt"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type pair struct {
 | 
	
		
			
				|  |  | +	_1 int
 | 
	
		
			
				|  |  | +	_2 int
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type maxHeap []pair
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (h maxHeap) Len() int           { return len(h) }
 | 
	
		
			
				|  |  | +func (h maxHeap) Less(i, j int) bool { return h[j]._1 < h[i]._1 }
 | 
	
		
			
				|  |  | +func (h maxHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (h *maxHeap) Push(x interface{}) {
 | 
	
		
			
				|  |  | +	*h = append(*h, x.(pair))
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (h *maxHeap) Pop() interface{} {
 | 
	
		
			
				|  |  | +	l := len(*h)
 | 
	
		
			
				|  |  | +	x := (*h)[l-1]
 | 
	
		
			
				|  |  | +	*h = (*h)[:l-1]
 | 
	
		
			
				|  |  | +	return x
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func main() {
 | 
	
		
			
				|  |  | +	var n, m int
 | 
	
		
			
				|  |  | +	fmt.Scan(&n, &m)
 | 
	
		
			
				|  |  | +	nums := make([]int, n)
 | 
	
		
			
				|  |  | +	l, r := make([]int, n), make([]int, n)
 | 
	
		
			
				|  |  | +	var h maxHeap
 | 
	
		
			
				|  |  | +	for i := 0; i < n; i++ {
 | 
	
		
			
				|  |  | +		fmt.Scan(&nums[i])
 | 
	
		
			
				|  |  | +		heap.Push(&h, pair{nums[i], i})
 | 
	
		
			
				|  |  | +		l[i] = (i + n - 1) % n
 | 
	
		
			
				|  |  | +		r[i] = (i + 1) % n
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	sum := 0
 | 
	
		
			
				|  |  | +	for i := 0; i < m; i++ {
 | 
	
		
			
				|  |  | +		p := heap.Pop(&h).(pair)
 | 
	
		
			
				|  |  | +		for l[p._2] == -1 {
 | 
	
		
			
				|  |  | +			p = heap.Pop(&h).(pair)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		sum += p._1
 | 
	
		
			
				|  |  | +		left, right := l[p._2], r[p._2]
 | 
	
		
			
				|  |  | +		l[p._2], r[p._2] = l[left], r[right]
 | 
	
		
			
				|  |  | +		l[left], l[right] = -1, -1 // Mark element as used
 | 
	
		
			
				|  |  | +		np := pair{nums[left] + nums[right] - p._1, p._2}
 | 
	
		
			
				|  |  | +		heap.Push(&h, np)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	fmt.Println(sum)
 | 
	
		
			
				|  |  | +}
 |