import sys def main(): # 入力の一括読み込み(C++のcinの高速化に相当) input_data = sys.stdin.read().split() if not input_data: return n = int(input_data[0]) k = int(input_data[1]) a = [int(x) for x in input_data[2:2+n]] # 自明な不可能判定 # N個の数列から隣接せずに選べる最大個数は (N + 1) // 2 個 if k > (n + 1) // 2: print("Impossible") return INF = 10**18 # dp[j][flag] # j: 選んだ個数 (0 <= j <= k) # flag: 直前の要素を選んだか (0: 選んでいない, 1: 選んだ) dp = [[-INF] * 2 for _ in range(k + 1)] dp[0][0] = 0 for i in range(n): next_dp = [[-INF] * 2 for _ in range(k + 1)] for j in range(k + 1): # 【遷移1】i番目の要素を削除(選ばない)場合 # 前回選んでいても、いなくてもよいので、大きい方を引き継ぐ next_dp[j][0] = max(dp[j][0], dp[j][1]) # 【遷移2】i番目の要素を選ぶ場合 # 「前回選んでいない状態(dp[j-1][0])」からしか遷移できない if j > 0 and dp[j - 1][0] != -INF: next_dp[j][1] = dp[j - 1][0] + a[i] # テーブルを更新 dp = next_dp # 答えは N 番目まで見て K 個選んだ状態の最大値 ans = max(dp[k][0], dp[k][1]) print(ans) if __name__ == '__main__': main()