1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <bits/stdc++.h>
const int kMaxN = 1e5 + 5, kMaxM = 3e5 + 5;
int n, m, p, cnt_odd; int ans[kMaxM]; std::tuple<int, int, int, int> ed[kMaxM]; std::vector<std::pair<int, int>> vec[kMaxM * 4];
struct DSU { int fa[kMaxN], sz[kMaxN], rnk[kMaxN]; std::vector<std::tuple<int, int, int>> vec;
void init() { for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1, rnk[i] = 0; cnt_odd = n; }
void back(int t) { for (; vec.size() > t; vec.pop_back()) { auto [fx, fy, det] = vec.back(); cnt_odd -= (sz[fy] & 1); fa[fx] = fx, rnk[fy] -= det, sz[fy] -= sz[fx]; cnt_odd += (sz[fx] & 1) + (sz[fy] & 1); } }
int find(int x) { return x == fa[x] ? x : find(fa[x]); } void unionn(int x, int y) { int fx = find(x), fy = find(y); if (fx == fy) return; if (rnk[fx] > rnk[fy]) std::swap(fx, fy); int det = (rnk[fx] == rnk[fy]); cnt_odd -= (sz[fx] & 1) + (sz[fy] & 1); fa[fx] = fy, rnk[fy] += det, sz[fy] += sz[fx]; vec.emplace_back(fx, fy, det); cnt_odd += (sz[fy] & 1); } } dsu;
void update(int x, int l, int r, int ql, int qr, std::pair<int, int> ed) { if (l > qr || r < ql) return; else if (l >= ql && r <= qr) return void(vec[x].emplace_back(ed)); int mid = (l + r) >> 1; update(x << 1, l, mid, ql, qr, ed), update(x << 1 | 1, mid + 1, r, ql, qr, ed); }
void solve(int x, int l, int r) { int t = dsu.vec.size(); for (auto [u, v] : vec[x]) dsu.unionn(u, v); if (l == r) { for (; p < m && cnt_odd;) { ++p; auto [w, u, v, id] = ed[p]; if (id <= l) { dsu.unionn(u, v); update(1, 1, m, id, l - 1, {u, v}); } } if (!cnt_odd) ans[l] = std::get<0>(ed[p]); else ans[l] = -1; } else { int mid = (l + r) >> 1; solve(x << 1 | 1, mid + 1, r); solve(x << 1, l, mid); } dsu.back(t); }
void dickdreamer() { std::cin >> n >> m; for (int i = 1; i <= m; ++i) { int u, v, w; std::cin >> u >> v >> w; ed[i] = {w, u, v, i}; } std::sort(ed + 1, ed + 1 + m); dsu.init(); solve(1, 1, m); for (int i = 1; i <= m; ++i) std::cout << ans[i] << '\n'; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|