#include #include #include using namespace std; //遅延セグ木(自作) class seguki{ public: //1index vectornum; int siz=1; void init(int n){ while(siz=num.size())return; num[a*2]+=num[a]; num[a*2+1]+=num[a]; orosu(a*2); orosu(a*2+1); } }; int main() { int n,m; cin >> n >> m; if(m==0){ for(int i=0;ia(n); for(int i=0;i> a[i]; vector>num(m+1); for(int i=0;i,vector>,greater>>prq; int must=0; for(int i=0;ihako=prq.top(); prq.pop(); int left=-1,right=num[hako.second].size(); while(left+1!=right){ int mokuteki=(left+right)/2; if(num[hako.second][mokuteki]<=hako.first)left=mokuteki; else right=mokuteki; } if(right==num[hako.second].size()){ ok=false; break; } prq.push(make_pair(num[hako.second][right],hako.second)); must=max(must,num[hako.second][right]); } if(ok==false)break; //ここまででどこまで取ればM未満が埋まるかが分かる。 ans.haiti(must-t+1,n-t+2,1,ans.siz+1,1,1); } ans.orosu(1); for(int i=0;i