#include using namespace std; typedef long long ll; typedef vector vi; typedef vector vl; typedef complex P; typedef pair pii; #define REP(i,n) for(ll i=0;i> n >> m; UF uf(n); REP(i,m){ int u,v; cin>>u>>v; --u;--v; uf.unite(u,v); } map szs; REP(i,n){ if(uf.root(i)==i) szs[uf.size(i)]+=1; // szs.push_back(uf.size(i)); } // map dp; // map::iterator iter; ll left = 1; ll med = (n+1)/2; vl dp(med+1,1e18); dp[0] = -1; vl dp2(med+1,-1e18); dp2[0] = -1; map::iterator iter2; iter2 = szs.begin(); while(iter2!=szs.end()){ ll num = iter2->first; ll cnt = iter2->second; ++iter2; if(num > med)continue; // iter = dp.end(); // while(iter!=dp.begin()){ REPR(_j,med+1){ ll id = med-_j; if(id+num*cntfirst; // ll val = iter->second; REP(i,cnt){ id += num; val += 1; val2 += 1; if(id>med)break; // if(dp.count(id)){ dp[id]=min(dp[id],val); dp2[id]=max(dp2[id],val2); // }else{ // dp[id]=val; // } } // if(id+szs[i]<=n){ // if(dp.count(id+szs[i]) == 1) // dp[id+szs[i]] = min(dp[id+szs[i]],val+1); // else // dp[id+szs[i]] = val+1; // } } while(left <= num){ if(dp[left]==1e18) cout << -1 << endl; else cout << dp[left] << endl; ++left; } } while(left <= med){ if(dp[left]==1e18) cout << -1 << endl; else cout << dp[left] << endl; ++left; } FOR(i,med+1,n+1){ if(dp2[n-i]==-1e18) cout << -1 << endl; else cout << szs.size()-dp2[n-i]-2 << endl; } // REPR(i,n+1){ // // if(dp.count(i) == 1){ // if(dp[i]!=1e18){ // cout << dp[i] << endl; // }else{ // cout << -1 << endl; // } // } return 0; }