#include using namespace std; struct adat{ int x, y, m; }; struct union_find{ vector osok, mely; vector v; void init(int n){ osok.assign(n, -1); mely.assign(n, 0); } int os(int x) { return osok[x] == -1 ? x : osok[x] = os(osok[x]); } bool unio(int a, int b){ a = os(a); b = os(b); if(a == b) return false; if(mely[a] < mely[b]) swap(a, b); v.push_back({b, a, mely[a]}); osok[b] = a; mely[a] += mely[b] == mely[a]; return true; } void vissza(){ if(v.size() == 0) return; osok[v.back().x] = -1; mely[v.back().y] = v.back().m; v.pop_back(); } }; vector> elek; vector h; union_find uni; void megold(int l, int r, int L, int R){ if(l >= r) return; int meret = uni.v.size(); int m = (l+r)>>1; for(int i = m; i < min(r, L); i++) uni.unio(elek[i].first, elek[i].second); int M = max(L, m); int meret2 = uni.v.size(); while(M < R && uni.unio(elek[M].first, elek[M].second)) M++; M--; h[m] = M-m+1; while(uni.v.size() > meret2) uni.vissza(); for(int i = m; i < min(L, r); i++) uni.unio(elek[i].first, elek[i].second); megold(l, m, L, M+1); while(uni.v.size() > meret) uni.vissza(); megold(m+1, r, M, R); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, m; cin>>n>>m; uni.init(n); h.resize(m); elek.resize(m); for(auto &e : elek){ cin>>e.first>>e.second; --e.first; --e.second; } //megold(0, m, 0, m); for(int i = 0; i < m; i++){ union_find uni2; uni2.init(n); int j = i; while (j < m && uni2.unio(elek[j].first, elek[j].second)) j++; h[i] = j-i; } vector ossz(m+1, 0); ossz[1] = h[0]; for(int i = 1; i < m; i++) ossz[i+1] = ossz[i] + 1ll*h[i]; /*for(int i = 0; i < m; i++){ cout<>q; while (q--) { int a, b; cin>>a>>b; int l = a-2, r = b; while(l+1 < r){ int m = (l+r)>>1; if(m+h[m] >= b) r = m; else l = m; } //cout<<"l: "<