#include<bits/stdc++.h> usingnamespace std; using ll = longlong;
constint maxn = 3e5 + 50; constint maxlg = 20;
structPath { int s, t, lca, dist; } p[maxn]; structSeg { int opt, val; }; vector< Seg > add[maxn], del[maxn]; vector< int > adj[maxn]; int dep[maxn], up[maxn][maxlg]; int w[maxn], ans[maxn]; int cnt1[maxn << 1], cnt2[maxn << 1]; int n, m;
voiddfs_lca( int u, int p ) { dep[u] = dep[p] + 1, up[u][0] = p; for( int i = 1; i < maxlg; ++ i ) up[u][i] = up[up[u][i - 1]][i - 1]; for( int v : adj[u] ) if( v != p ) dfs_lca( v, u ); }
intget_lca( int u, int v ) { if( dep[u] < dep[v] ) swap( u, v ); int diff = dep[u] - dep[v]; for( int i = maxlg - 1; i >= 0; -- i ) if( (diff >> i) & 1 ) u = up[u][i]; if( u == v ) return u; for( int i = maxlg - 1; i >= 0; -- i ) if( up[u][i] != up[v][i] ) u = up[u][i], v = up[v][i]; return up[u][0]; }
voiddfs_solve( int u, int p ) { int upVal = w[u] + dep[u]; int downVal = w[u] - dep[u] + maxn;