单调队列 + set
#include <cstdio>
#include <set>
#include <deque>
using namespace std;
const int maxn=1e5+10;
int n,a[maxn],q[maxn];
long long m,sum[maxn],dp[maxn];
multiset<long long> s;
deque<int> que;
int main(){
scanf("%d%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>m){puts("-1");return 0;}
sum[i]=sum[i-1]+a[i];
}
int j=0;
for(int i=1;i<=n;i++){
while(sum[i]-sum[j]>m)++j;
while(que.size()&&que[0]<=j){
if(que.size()>1)s.erase(s.find(a[que[1]]+dp[que[0]]));
que.pop_front();
}
while(que.size()&&a[que.back()]<=a[i]){
if(que.size()>1)s.erase(s.find(a[que.back()]+dp[que[que.size()-2]]));
que.pop_back();
}
que.push_back(i);
if(que.size()>1)s.insert(a[i]+dp[que[que.size()-2]]);
dp[i]=dp[j]+a[que[0]];
if(que.size()>1)dp[i]=min(dp[i],*s.begin());
}
printf("%lld\n",dp[n]);
return 0;
}