/* -*- coding: utf-8 -*- * * 3103.cc: No.3103 Butterfly Effect - yukicoder */ #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 400000; const int MAX_QN = 400000; /* typedef */ using pii = pair; using spii = set; /* global variables */ int ps[MAX_QN], xs[MAX_QN], ys[MAX_QN]; int qs[MAX_QN], ts[MAX_N]; spii evs[MAX_N]; /* subroutines */ /* main */ int main() { int n, qn; scanf("%d%d", &n, &qn); for (int i = 0; i < qn; i++) { scanf("%d%d%d", ps + i, xs + i, ys + i); ps[i]--, xs[i]--, ys[i]--; } fill(ts, ts + n, qn); ts[0] = -1; int cnt = 1; for (int i = 0; i < qn; i++) { int pi = ps[i], xi = xs[i], yi = ys[i]; if (ts[xi] < pi && ts[yi] < pi) { printf("%d\n", cnt); continue; } if (ts[xi] > pi && ts[yi] > pi) { evs[xi].insert({pi, yi}); evs[yi].insert({pi, xi}); printf("%d\n", cnt); continue; } if (ts[xi] > pi) swap(xi, yi); if (ts[yi] >= qn) cnt++; ts[yi] = pi; priority_queue q; q.push({-pi, yi}); while (! q.empty()) { auto [pu, u] = q.top(); q.pop(); pu = -pu; auto sit = evs[u].lower_bound({pu, -1}); while (sit != evs[u].end()) { auto [pv, v] = *sit; if (ts[v] > pv) { if (ts[v] >= qn) cnt++; ts[v] = pv; q.push({-pv, v}); } sit = evs[u].erase(sit); } } printf("%d\n", cnt); } return 0; }