//ライブラリ
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <map>
#include <numeric>
#include <cmath>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <complex>
#include <string.h>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <iomanip>
#include <sys/time.h>
#include <tuple>
#include <random>
#include <functional>
using namespace std;

//ユーティリティ
#define rep(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define reps(i,n) for(int i=1, i##_len=(n); i<=i##_len; ++i)
#define rrep(i,n) for(int i=n-1; i>=0; --i)
#define rreps(i,n) for(int i=n; i>0; --i)
#define vmax(v) *max_element(all(v))
#define vmin(v) *min_element(all(v))
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define uniq(v) (v).erase(unique((v).begin(), (v).end()), (v).end())

template<class T>bool chmax(T &former, const T &b) {if (former<b) {former=b;return true;} return false;}
template<class T>bool chmin(T &former, const T &b) {if (former>b) {former=b;return true;} return false;}

//型
typedef long long unsigned int ll;

//定数
const int inf = (1e9+9);
const double pi = (acos(-1));
const ll mod = 1e9 + 7;
const double eps = 1e-8;

//セグメント木
//データ構造
template< typename Monoid >
struct SegmentTree {
  using F = function< Monoid(Monoid, Monoid) >;
 
  int sz;
  vector< Monoid > seg;
 
  const F f;
  const Monoid M1;
 
  SegmentTree(int n, const F f, const Monoid &M1) : f(f), M1(M1) {
    sz = 1;
    while(sz < n) sz <<= 1;
    seg.assign(2 * sz, M1);
  }
 
  void set(int k, const Monoid &x) {
    seg[k + sz] = x;
  }
 
  void build() {
    for(int k = sz - 1; k > 0; k--) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }
 
  void update(int k, const Monoid &x) {
    k += sz;
    seg[k] = x;
    while(k >>= 1) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }
 
  Monoid query(int a, int b) {
    Monoid L = M1, R = M1;
    for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
      if(a & 1) L = f(L, seg[a++]);
      if(b & 1) R = f(seg[--b], R);
    }
    return f(L, R);
  }
 
  Monoid operator[](const int &k) const {
    return seg[k + sz];
  }
};


//GCD
int gcd(int a, int b) {
	while(1) {
		if (a<b) swap(a, b);
		if(!b) break;
		a %= b;
	}
	return a;
}

int gcd(const vector<int> &list) {
	int a = list[0];
	for(auto i=1; i<list.size(); i++) {
		a = gcd(a, list[i]);	
	}
	return a;
}

typedef pair<int, int> pair_int;
typedef pair<ll, ll>   pair_ll;
typedef priority_queue<int, vector<int>> pq;
typedef priority_queue<int, vector<int>, greater<int>> rpq;


vector<int> v;

int n, k;

void input() {
	cin >> n >> k;
	cin.ignore();
	v = vector<int>(n);
	rep(i, n) {
		cin >> v[i];
	}
	cin.ignore();
}

int solve() {
	//マイナスだったら取らない方がマシ
	int ret = 0;
	rep(l, n+1) {
		rep(r, n+1) {
			if (l + r > n) continue;
			if (l + r > k) continue;
			//両側から足す
			rpq q;
			rep(i, l) q.push(v[i]);
			rep(i, r) q.push(v[n-1-i]);
			//残った操作回数で捨てられるだけ捨てる(貪欲)
			rep(c, k - l - r) {
				if (q.empty()) break;
				if (q.top() > 0) break;//正数は捨てない
				q.pop();
			}
			int sum = 0;
			while (!q.empty()) {
				sum += q.top(); q.pop();
			}
			chmax(ret, sum);
		}
	}
	return ret;
}

int main() {
	input();
	cout << solve() << endl;
}	

Measured memory_bytes: 256