// fast // O(N + Q log Q) #include using namespace std; int main() { int n, q; cin >> n >> q; vector x(q,-1), y(q,-1); // dp[i] ... 人 i は時刻 dp[i] に知る. (dp[i]=q+1 ならまだ知らない) vector dp(n, q+1); dp[0] = -1; vector>> horyu(n); int ans = 1; for (int num=0; num> p; p--; int x, y; cin >> x >> y; x--; y--; if (dp[x] < p && dp[y] < p) { // なにもしない }else if (dp[x] > p && dp[y] > p) { // 保留する horyu[x].insert(pair(p,y)); horyu[y].insert(pair(p,x)); }else{ if (dp[y] < p) { swap(x, y); } // 時刻 p の時点で dp[x] が知っており dp[y] が知らない assert(dp[x] < p && dp[y] > p); if (dp[y] == q+1) ans++; dp[y] = p; vector> mada = {pair(y,p)}; while (!mada.empty()) { auto [i,t] = mada.back(); mada.pop_back(); while (true) { auto itr = horyu[y].lower_bound(pair(t,0)); if (itr == horyu[y].end()) { break; } int tim = (*itr).first; int z = (*itr).second; horyu[y].erase(itr); if (dp[z] > tim) { if (dp[z] == q+1) ans++; dp[z] = tim; mada.push_back(pair(z,tim)); } } } } cout << ans << '\n'; } }