WA on #5,#6,#7
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+5,inf=5e5;
int a[N],dp[N],res[N];
struct Segmenttree{
int l,r;
int w;
}t[4*(2*inf+10)];
void pushup(int u)
{
t[u].w=min(t[u<<1].w,t[u<<1|1].w);
}
void build(int l,int r,int u)
{
t[u].l=l,t[u].r=r;
if(l==r)
{
t[u].w=0x3f3f3f3f;
return;
}
int mid=l+r>>1;
build(l,mid,u<<1);
build(mid+1,r,u<<1|1);
pushup(u);
}
int query(int u,int l,int r)//区间查询
{
if(t[u].l>=l&&t[u].r<=r)
return t[u].w;
if(t[u].r<l||t[u].l>r)
return 0x3f3f3f3f;
return min(query(u<<1,l,r),query(u<<1|1,l,r));
}
void update(int u, int pos, int val)
{
if(t[u].l==t[u].r)
{
t[u].w=min(t[u].w,val);
return;
}
int mid=(t[u].l+t[u].r)>>1;
if(pos<=mid) update(u<<1,pos,val);
else update(u<<1|1,pos,val);
pushup(u);
}
main()
{
std::ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
memset(dp,0x3f,sizeof dp);
for(int i=1;i<=n;++i)
{
cin>>a[i],a[i]--;
if(!a[i])a[i]--;
res[i]=res[i-1]+a[i];
}
build(0,2*inf,1);
update(1,inf,0);
for(int i=1;i<=n;++i)
{
dp[i]=query(1,res[i]-m+inf,res[i]+m+inf)+1;
update(1,res[i]+inf,dp[i]);
// cout<<dp[i]<<" ";
}
cout<<dp[n];
return 0;
}