#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<int , int>
#define lii pair<long long , pair<int , int>>
#define iii pair<int , pair<int , int>>
#define iiii pair<pair<int , int> , pair<int , int>>
#define llll pair<pair<__int128 , __int128> , pair<__int128 , __int128>>
#define li pair<long long , int>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))

const long long INF = 1e16;
const long long MOD = 1e9 + 7;
const int N = 1e5 + 7;
int n , L[N];
long long m , a[N] , f[N] , t[4 * N] , lazy[4 * N];
bool bl = 1;

void ktao(){
    int i = n , j = n;
    long long sum = a[n];
    while (i > 0){
        while (j > 1 && sum + a[j - 1] <= m){
            --j;
            sum += a[j];
        }

        L[i] = j;
        sum -= a[i];
        --i;
        if (j > i){
           j = i;
           sum += a[i];
        }
    }
}

void inp(){
    cin >> n >> m;
    for (int i = 1 ; i <= n ; ++i){
        cin >> a[i];
        if (a[i] > m) bl = 0;
    }
    if (!bl){
        cout << -1;
        exit(0);
    }

    ktao();
}

void push(int id){
    if (lazy[id]){
        lazy[id << 1] += lazy[id];
        t[id << 1] += lazy[id];
        lazy[id << 1 | 1] += lazy[id];
        t[id << 1 | 1] += lazy[id];
        lazy[id] = 0;
    }
}

void update(int id , int l , int r , int u , int v , long long val){
    if (l > v || r < u) return;
    if (u <= l && r <= v){
        t[id] += val;
        lazy[id] += val;
        return;
    }

    int mid = (l + r) >> 1;
    push(id);
    update(id << 1 , l , mid , u , v , val);
    update(id << 1 | 1 , mid + 1 , r , u , v , val);
    if (t[id << 1] == 0) t[id] = t[id << 1 | 1];
    else if (t[id << 1 | 1] == 0) t[id] = t[id << 1];
    else t[id] = min(t[id << 1] , t[id << 1 | 1]);
}

long long get(int id , int l , int r , int u , int v){
    if (l > v || r < u) return INF;

    if (u <= l && r <= v) return t[id];

    int mid = (l + r) >> 1;
    push(id);
    long long t1 = get(id << 1 , l , mid , u , v);
    long long t2 = get(id << 1 | 1 , mid + 1 , r , u , v);
    if (t1 == 0) t1 = INF;
    if (t2 == 0) t2 = INF;
    return min(t1 , t2);
}

void solve(){
    stack<iii> st;
    f[1] = a[1];
    st.push({1 , {1 , 1}});
    update(1 , 0 , n , 1 , 1 , f[1]);
    update(1 , 0 , n , 0 , 0 , a[1]);

    for (int i = 2 ; i <= n ; ++i){
        update(1 , 0 , n , i - 1 , i - 1 , a[i]);
        int l = i;
        while (st.size() && a[i] >= a[st.top().fi]){
            update(1 , 0 , n , st.top().se.fi - 1 , st.top().se.se - 1 , a[i] - a[st.top().fi]);
            l = st.top().se.fi;
            st.pop();
        }

        st.push({i , {l , i}});
        f[i] = get(1 , 0 , n , L[i] - 1 , i - 1);
        update(1 , 0 , n , i , i , f[i]);
    }

    cout << f[n];
}

int main(){
//    freopen("difmax.inp" , "r" , stdin);
//    freopen("difmax.out" , "w" , stdout);
    faster;
    inp();
    solve();
    return 0;
}
