#include #define rep(E, F) for (E = 0; E < (F); E++) #define per(E, F) for (E = (F) - 1; E >= 0; E--) void swap(int *a, int *b) { int s = *a; *a = *b; *b = s; } int max(int a, int b) { return a < b ? b : a; } int min(int a, int b) { return a < b ? a : b; } int get_int() { int r = 0, c = getchar(), s = (c == ' ' ? -1 : 1); if (c < '0' || c > '9') return get_int(); for (; c >= '0' && c <= '9'; c = getchar()) r = r*10 + c - '0'; return s*r; } int sss(int *a, int n, int c) { int i, j, r, d[++c]; rep(i, c) d[i] = 0; d[0] = 1; rep(i, n) per(j, c - a[i]) if (d[j]) d[j + a[i]] = 1; per(i, c) if (d[i]) return i; } int main() { int i, j, n = get_int(), x = get_int(), mx = 0, t = 0, s; int a[n]; rep(i, n) mx = max(mx, a[i] = get_int()); i = 0; while (i < n) (a[i] > x) ? (swap(&a[i], &(a[n - 1])), n--) : (i++); if (n == 0) { printf("%d\n", max(mx, 0)); return 0; } if (n == 1 || n == 2) { printf("%d\n", max(mx, a[0])); return 0; } if (n == 3) { printf("%d\n", max(mx, x + 1)); return 0; } rep(j, 4) { n--; rep(i, n) if (a[i] < a[i + 1]) swap(&a[i], &a[i + 1]); } rep(i, n) t += (a[i] = x + 1 - a[i]); s = sss(a, n, t/2); printf("%d\n", max(mx, max(s, t - s) + x + 1)); return 0; }