import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void scan(T...)(ref T a) {
    string[] ss = readln.split;
    foreach (i, t; T) a[i] = ss[i].to!t;
}
T read(T)() { return readln.chomp.to!T; }
T[] reads(T)() { return readln.split.to!(T[]); }
alias readint = read!int;
alias readints = reads!int;

int calc(int k, int[] v) {
    int ans = 0;

    // 左から i 個とる
    for (int i = 0; i < min(k, v.length); i++) {
        int val = 0;
        int[] neg;
        for (int j = 0; j < i; j++) {
            val += v[j];
            if (v[j] < 0) {
                neg ~= v[j];
            }
        }

        int[] w = v.dup.drop(i);
        w.reverse();
        neg.sort();

        int restK = k - i;
        ans = max(ans, val + w.take(restK).sum); // 残りは全て右側からとる
        // 手持ちのマイナスを j 個もどす
        for (int j = 1; j <= neg.length; j++) {
            if (j > restK) break;
            // int x = -neg.take(j).sum + w.take(restK - j).sum;
            int x = -neg.take(j).sum; // マイナス戻す
            ans = max(ans, val + x);

            // 残りは右側からとる
            int kk = restK - j; // 必ずしも kk 個とる必要はない
            if (kk > 0) {
                int[] t = new int[kk];
                t[0] = w[0];
                for (int k1 = 1; k1 < kk; k1++) {
                    t[k1] = t[k1-1] + w[k1];
                }

                int ma = t.reduce!max;
                if (ma > 0) {
                    ans = max(ans, val + x + ma);
                }
            }
        }
    }

    return ans;
}

void main() {
    int n, k; scan(n, k);
    auto v = readints;
    writeln(calc(k, v));
}
