Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- using pld = pair<ld, ld>;
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define ins insert
- #define btpc __builtin_popcount
- #define btclz __builtin_clz
- #define sz(x) (int)(x.size());
- #define all(x) x.begin(), x.end()
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- template<class X, class Y>
- bool minimize(X &x, const Y &y) {
- if (x > y)
- {
- x = y;
- return true;
- }
- return false;
- }
- template<class X, class Y>
- bool maximize(X &x, const Y &y) {
- if (x < y)
- {
- x = y;
- return true;
- }
- return false;
- }
- const int MOD = 1e9 + 7; //998244353
- template<class X, class Y>
- void add(X &x, const Y &y) {
- x = (x + y);
- if(x >= MOD) x -= MOD;
- }
- template<class X, class Y>
- void sub(X &x, const Y &y) {
- x = (x - y);
- if(x < 0) x += MOD;
- }
- /* Author : Le Ngoc Bao Anh, 11A5, LQD High School for Gifted Student*/
- const ll INF = 1e9;
- const int N = 1e5 + 10;
- const int LOG = 16;
- int par[N], sz[N], dp[N], depth[N];
- pii f[N][LOG + 2];
- vector<pii> g[N];
- bool used[N * 10];
- multiset<int> curr;
- int ans[N * 10];
- vector<int> son[N], a[N], b[N];
- struct Edges {
- int u, v, w, id;
- bool operator < (const Edges & temp) const {
- return w < temp.w;
- }
- } ed[N * 10];
- int find_par(int u) {
- if(par[u] < 0) return u;
- par[u] = find_par(par[u]);
- return par[u];
- }
- bool merge(int u, int v) {
- u = find_par(u), v = find_par(v);
- if(u == v) return false;
- if(par[u] > par[v]) swap(u, v);
- par[u] += par[v];
- par[v] = u;
- return true;
- }
- void dfs(int u) {
- sz[u] = 1;
- for(auto v : g[u]) {
- if(v.fi != f[u][0].fi) {
- f[v.fi][0] = mp(u, v.se);
- depth[v.fi] = depth[u] + 1;
- dfs(v.fi);
- sz[u] += sz[v.fi];
- }
- }
- }
- pii find_d(int u, int v) {
- if(depth[u] < depth[v]) swap(u, v);
- int ans = 0;
- for(int i = LOG; i >= 0; i--) {
- if(depth[u] - (1 << i) >= depth[v]) {
- maximize(ans, f[u][i].se);
- u = f[u][i].fi;
- }
- }
- if(u == v) return mp(v, ans);
- for(int i = LOG; i >= 0; i--) {
- if(f[u][i].fi != f[v][i].fi) {
- maximize(ans, f[u][i].se);
- maximize(ans, f[v][i].se);
- u = f[u][i].fi; v = f[v][i].fi;
- }
- }
- maximize(ans, f[u][0].se);
- maximize(ans, f[v][0].se);
- return mp(f[u][0].fi, ans);
- }
- void dot(int u, int p, bool isBig) {
- int big = -1;
- for(auto nxt : g[u]) {
- int v = nxt.fi;
- if(v != p) {
- if(big == -1 || sz[big] < sz[v]) big = v;
- }
- }
- for(auto nxt : g[u]) {
- int v = nxt.fi;
- if(v != p && v != big) {
- dot(v, u, 0);
- }
- }
- if(big > 0) {
- dot(big, u, 1);
- swap(son[big], son[u]);
- }
- son[u].pb(u);
- for(auto nxt : g[u]) {
- int v = nxt.fi;
- if(v != p && v != big) {
- for(auto x : son[v]) {
- for(auto d : a[x]) curr.ins(d);
- son[u].pb(x);
- }
- for(auto x : son[v]) {
- for(auto d : b[x]) {
- auto iter = curr.find(d);
- assert(iter != curr.end());
- curr.erase(iter);
- }
- }
- }
- }
- for(auto x : a[u]) curr.ins(x);
- for(auto x : b[u]) {
- auto iter = curr.find(x);
- assert(iter != curr.end());
- curr.erase(iter);
- }
- dp[u] = (curr.empty() ? INF : (*curr.begin()));
- if(!isBig) curr.clear();
- }
- void solve() {
- int n, m;
- cin >> n >> m;
- for(int i = 1; i <= m; i++) {
- int u, v, w; cin >> u >> v >> w;
- ed[i] = {u, v, w, i};
- }
- for(int i = 1; i <= n; i++) par[i] = -1;
- sort(ed + 1, ed + 1 + m);
- for(int i = 1; i <= m; i++) {
- used[i] = merge(ed[i].u, ed[i].v);
- if(used[i]) {
- g[ed[i].u].pb(mp(ed[i].v, ed[i].w));
- g[ed[i].v].pb(mp(ed[i].u, ed[i].w));
- }
- }
- depth[1] = 1; dfs(1);
- for(int j = 1; j <= LOG; j++) {
- for(int i = 1; i <= n; i++) {
- if(depth[i] <= (1 << j)) continue;
- int u = f[i][j - 1].fi;
- f[i][j].fi = f[u][j - 1].fi;
- f[i][j].se = max(f[i][j - 1].se, f[u][j - 1].se);
- }
- }
- for(int i = 1; i <= m; i++) {
- if(!used[i]) {
- int id = ed[i].id;
- int u = ed[i].u, v = ed[i].v;
- int w = ed[i].w;
- pii tmp = find_d(u, v);
- ans[id] = tmp.se;
- if(depth[u] < depth[v]) swap(u, v);
- a[u].pb(w);
- a[v].pb(w);
- b[tmp.fi].pb(w);
- b[tmp.fi].pb(w);
- }
- }
- dot(1, 0, 0);
- for(int i = 1; i <= m; i++) {
- if(used[i]) {
- int u = ed[i].u, v = ed[i].v;
- if(depth[u] < depth[v]) swap(u, v);
- int id = ed[i].id;
- ans[id] = dp[u];
- }
- }
- for(int i = 1; i <= m; i++) {
- cout << ans[i] << '\n';
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- //online
- #endif
- int tc = 1, ddd = 0;
- // cin >> tc;
- while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement