求调,20pts
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N =1e6+5,inf = 2e9,memse = 0x3f;
using pii = pair<int,int>;
struct TreeNode
{
int l,r;
ll mx;
void tag(ll x){
mx =x;
}
};
int a[N],nfd[N];//nfd[i]: dfn为i值的点
struct SegTree
{
#define ls num<<1
#define rs num<<1|1
#define mid ((tr[num].l+tr[num].r)>>1)
TreeNode tr[N<<2];
void Up(TreeNode &a,TreeNode b, TreeNode c){
a.mx= max(b.mx , c.mx);
}
void build(int num,int L,int R){
tr[num].l=L,tr[num].r=R;
if(L==R){
tr[num].mx = a[nfd[L]];
return;
}
build(ls,L,mid);
build(rs,mid+1,R);
Up(tr[num],tr[ls],tr[rs]);
}
void upd(int num, int tar, ll v)
{
if (tr[num].l==tr[num].r&&tr[num].l == tar)
{
tr[num].tag(v);
return;
}
if (mid >= tar)
upd(ls, tar, v);
else
upd(rs, tar, v);
Up(tr[num], tr[ls], tr[rs]);
}
TreeNode qry(int num,int L,int R){
if(L<=tr[num].l&&tr[num].r<=R){
return tr[num];
}
TreeNode x={0,0,0};
if(L<=mid) Up(x,x,qry(ls,L,R));
if(mid<R) Up(x,x,qry(rs,L,R));
return x;
}
}tree;
struct Edge{int to,nxt,val,id=-1;}e[N<<2];int head[N],Ecnt;
void add(int u,int v,int w){e[++Ecnt] = {v,head[u],w};head[u] = Ecnt;}
int sz[N],dep[N],fa[N],son[N];
int top[N],dfn[N],tim;
void dfs1(int u,int fat){
sz[u]=1,fa[u]=fat,dep[u]=dep[fat]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fat) continue;
a[v]=e[i].val;
e[i].id=v;
dfs1(v,u);
sz[u] += sz[v];
if(sz[v] > sz[son[u]]) son[u] = v;
}
}
void dfs2(int u,int tp ){
dfn[u]=++tim,nfd[tim]=u,top[u]=tp;
if(son[u]) dfs2(son[u],tp);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
ll qry_pth(int u,int v){
ll res =0;
while(top[u] != top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
res = max(res,tree.qry(1,dfn[top[u]],dfn[u]).mx);
u = fa[top[u]];
}
if(dep[u]<dep[v]) swap(u,v);
res=max(res,tree.qry(1,dfn[v],dfn[u]).mx);
return res;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
//求助,树剖20pts,把边权下放到点上去了。
int n;
cin>>n;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
dfs1(1,0);
dfs2(1,1);
tree.build(1,1,n);
string opt;
while(cin>>opt){
if(opt=="DONE") break;
int x,y;cin>>x>>y;
if(opt=="QUERY") cout<< qry_pth(x,y)<<'\n';
else tree.upd(1,dfn[e[2*(x-1)+1].id],y);
}
return 0;
}