#include #include using namespace std; using namespace atcoder; using ll = long long; using vll = vector; template using umap = unordered_map; #define rep(i, n) for (int i = 0; i < n;i++) #define rep1(i, n) for (int i = 1; i <= n;i++) #define rrep(i, n) for (int i = n - 1; i >= 0;i--) #define rrep1(i, n) for (int i = n; i >= 1;i--) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define INF 1LL << 60 #define chmin(a, b) a = min(a, b) #define chmax(a, b) a = max(a, b) struct S { ll mx; int idx; }; S op(S a, S b) { S res; if (a.mx >= b.mx) { res.mx = a.mx; res.idx = a.idx; } else { res.mx = b.mx; res.idx = b.idx; } return res; } S e() { return {-INF, 0}; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; if (k > n / 2) { cout << "Impossible" << endl; return 0; } vector a(n); ll m = -1; int idx = 0; vector comp(n); rep(i, n) { cin >> a[i]; if (m < a[i]) { m = a[i]; idx = i; } comp[i] = {a[i], i}; } segtree seg(comp); ll ans = m; int cur = idx; seg.set(cur, {-INF, cur}); rep(i, k - 1) { S res = op(seg.prod(0, max(0, cur- 1)), seg.prod(min(n, cur + 2), n)); ans += res.mx; cur = res.idx; seg.set(res.idx, {-1, res.idx}); } cout << ans << endl; }