#include<bits/stdc++.h>
using namespace std;
int ans,n,m,cnt=1,vis[50010],b[50010],y[50010],w[50010],Y[50010];
struct node{
int v,id;
}a[50010];
bool cmp(node x,node y){
if(x.id==y.v)
return x.id>y.id;
return x.v<y.v;
}
map<int,int>M;
pair<int,int> t[200010];
set<int>s[200010];
int calc1(int x){
int l=1,r=cnt,tmp=cnt+1;
while(l<=r){
int mid=(l+r)/2;
if(w[mid]>=x)
r=mid-1,tmp=min(tmp,mid);
else
l=mid+1;
}
return tmp;
}
int calc2(int x){
int l=1,r=cnt,tmp=0;
while(l<=r){
int mid=(l+r)/2;
if(w[mid]<=x)
l=mid+1,tmp=max(tmp,mid);
else
r=mid-1;
}
return tmp;
}
void pushup(int id){
if(t[id*2].first>=t[id*2+1].first)
t[id]=t[id*2];
else
t[id]=t[id*2+1];
}
void build(int l,int r,int id){
if(l==r){
int tmp=Y[l];
t[id].first=*s[M[tmp]].begin();
t[id].second=a[tmp].v;
return ;
}
build(l,(l+r)/2,id*2);
build((l+r)/2+1,r,id*2+1);
pushup(id);
}
pair<int,int> query(int ql,int qr,int l,int r,int id){
if(ql>qr||r<ql||l>qr)
return make_pair(0,0);
if(l>=ql&&r<=qr)
return t[id];
pair<int,int>tmp1=query(ql,qr,l,(l+r)/2,id*2),tmp2=query(ql,qr,(l+r)/2+1,r,id*2+1);
if(tmp1.first>=tmp2.first)
return tmp1;
return tmp2;
}
void modify(int l,int r,int ql,int qr,int k,int id){
if(l>qr||r<ql||l>r)
return ;
if(l>=ql&&r<=qr){
t[id].first=k;
return ;
}
modify(l,(l+r)/2,ql,qr,k,id*2),modify((l+r)/2+1,r,ql,qr,k,id*2+1);
pushup(id);
return ;
}
void work(int x){
int tmp=m,Max;
priority_queue<pair<int,int> >q;
for(int i=x;i<=n;i++){
if(vis[i])
continue;
if(tmp<a[i].v)
break;
tmp-=a[i].v;
Max=max(a[i].v,Max);
q.push({-a[i].id,i});
}
while(!q.empty()){
int Tmp=-q.top().first,www=q.top().second;
q.pop();
pair<int,int> awa=query(calc1(Max+1),calc2(a[www].v+tmp),1,n,1);
if(awa.first>Tmp){
int ppp=*s[M[awa.second]].begin();
tmp-=b[Tmp],vis[y[*s[M[awa.second]].begin()]]=1;
s[M[awa.second]].erase(ppp);
if(!s[M[awa.second]].empty())
modify(1,n,M[awa.second],M[awa.second],*s[M[awa.second]].begin(),1);
else
modify(1,n,M[awa.second],M[awa.second],0,1);
}
else
vis[www]=1;
}
ans++;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].v,a[i].id=i;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
y[a[i].id]=i;
int cnt=0;
for(int i=1;i<=n;i++){
if(!M[a[i].v])
M[a[i].v]=++cnt,w[cnt]=a[i].v;
s[M[a[i].v]].insert(a[i].id);
Y[M[a[i].v]]=a[i].v;
}
build(1,cnt,1);
for(int i=1;i<=n;i++){
if(vis[i])
continue;
work(i);
}
cout<<ans;
}