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 n = cast(int)v.length;
    int ans = 0;

    // 左から a 個とる
    for (int a = 0; a <= n; a++) {
        if (a > k) break;

        int val = 0; // 宝石の合計
        int[] neg; // 負の宝石
        for (int i = 0; i < a; i++) {
            val += v[i];
            if (v[i] < 0) neg ~= v[i];
        }

        // 右から b 個とる
        for (int b = 0; b <= n; b++) {
            if (b > k) break;
            if (a + b > min(n, k)) break;

            int val2 = val;
            auto neg2 = neg.dup;
            for (int i = 0; i < b; i++) {
                val2 += v[n-1-i];
                if (v[n-1-i] < 0) neg2 ~= v[n-1-i];
            }

            // 操作回数が残っているなら、負の宝石を捨てる
            int restK = max(0, k - (a + b));
            if (restK > 0) {
                neg2.sort();
                for (int i = 0; i < min(restK, neg2.length); i++) {
                    val2 += -neg2[i];
                }
            }

            ans = max(ans, val2);
        }
    }
    return ans;
}

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