rt。自己算过空间了,大概11.5M,我觉得没啥问题/fn
#include<bits/stdc++.h>
#define int long long
#define lson(root) (root << 1)
#define rson(root) (root << 1 | 1)
using namespace std;
struct node
{
int to , nxt , w;
}e[200010];
struct edge
{
int mx;
}tree[400010];
int n , tot , head[100010] , a[100010] , dep[100010] , fa[100010] , son[100010] , sz[100010] , dfn[100010] , cnt , rk[100010] , tp[100010];
void add(int u , int v , int w)
{
++ tot;
e[tot].to = v;
e[tot].nxt = head[u];
e[tot].w = w;
head[u] = tot;
}
void dfs1(int u , int pa)
{
dep[u] = dep[pa] + 1 , fa[u] = pa , sz[u] = 1;
for(int i = head[u] ; i != 0 ; i = e[i].nxt)
{
int v = e[i].to;
if(v == pa) continue;
dfs1(v , u);
sz[u] += sz[v];
if(sz[v] > sz[son[u]]) son[u] = v;
}
}
void dfs2(int u , int tp_fa)
{
dfn[u] = ++ cnt , rk[cnt] = u , tp[u] = tp_fa;
if(son[u]) dfs2(son[u] , tp_fa);
for(int i = head[u] ; i != 0 ; i = e[i].nxt)
{
int v = e[i].to;
if(v == fa[u] || v == son[u]) continue;
dfs2(v , v);
}
}
void dfs_down(int u , int pa)
{
for(int i = head[u] ; i != 0 ; i = e[i].nxt)
{
int v = e[i].to;
if(v == pa) continue;
a[v] = e[i].w;
dfs_down(v , u);
}
}
void pushup(int root)
{
tree[root].mx = max(tree[lson(root)].mx , tree[rson(root)].mx);
}
void update(int root , int l , int r , int x , int y)
{
if(l == r)
{
tree[root].mx = y;
return;
}
int mid = (l + r) >> 1;
if(x <= mid) update(lson(root) , l , mid , x , y);
else update(rson(root) , mid + 1 , r , x , y);
pushup(root);
}
int query(int root , int l , int r , int L , int R)
{
if(L <= l && R >= r) return tree[root].mx;
int mid = (l + r) >> 1 , ans = 0;
if(L <= mid) ans = max(ans , query(lson(root) , l , mid , L , R));
if(R > mid) ans = max(ans , query(rson(root) , mid + 1 , r , L , R));
return ans;
}
void build(int root , int l , int r)
{
if(l == r)
{
tree[root].mx = a[rk[l]];
return;
}
int mid = (l + r) >> 1;
build(lson(root) , l , mid);
build(rson(root) , mid + 1 , r);
pushup(root);
}
int uv_query(int u , int v)
{
int ans = 0;
while(tp[u] != tp[v])
{
if(dep[tp[u]] < dep[tp[u]]) swap(u , v);
ans = max(ans , query(1 , 1 , n , dfn[tp[u]] , dfn[u]));
u = fa[tp[u]];
}
if(dep[u] < dep[v]) swap(u , v);
ans = max(ans , query(1 , 1 , n , dfn[v] , dfn[u]));
return ans;
}
signed main()
{
scanf("%lld" , &n);
for(int i = 1 , u , v , w ; i < n ; i ++) scanf("%lld%lld%lld" , &u , &v , &w) , add(u , v , w) , add(v , u , w);
dfs1(1 , 0) , dfs2(1 , 1) , dfs_down(1 , 0);
build(1 , 1 , n);
string s;
while(cin >> s && s != "DONE")
{
int x , y;
scanf("%lld%lld" , &x , &y);
if(s == "CHANGE") update(1 , 1 , n , x , y);
else printf("%lld\n" , (x == y) ? 0 : uv_query(x , y));
}
return 0;
}