#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+10;
int h[N],e[N*2],w[N*2],ne[N*2],id[N*2],cnt[N],idx;
int son[N],size[N],top[N],in[N],value[N],ord[N],f[N],depth[N],c;
void add(int a,int b,int c,int d)
{
e[idx]=b;
w[idx]=c;
id[idx]=d;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs1(int x,int fa,int d)
{
f[x]=fa;
depth[x]=d;
son[x]=-1;
size[x]=1;
for(int i=h[x];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa) continue;
value[j]=w[i];
cnt[id[i]]=j;
dfs1(j,x,d+1);
size[x]+=size[j];
if(son[x]==-1||size[j]>size[son[x]])
{
son[x]=j;
}
}
}
void dfs2(int x,int fa ,int t)
{
in[x]=++c;//第二次才求dfs序
ord[c]=x;
top[x]=t;
if(son[x]!=-1)
{
dfs2(son[x],x,t);
}
for(int i=h[x];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa||j==son[x]) continue;
dfs2(j,x,j);//top是j不是x
}
}
struct node{
int l,r,maxx;
}t[N*4];
void updown(int x)
{
t[x].maxx=max(t[x*2].maxx,t[x*2+1].maxx);
}
void build(int x,int l,int r)
{
t[x].l=l;t[x].r=r;
if(l==r)
{
t[x].maxx=value[ord[l]];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
updown(x);
}
void change(int x,int a,int b)
{
if(t[x].l==t[x].r)
{
t[x].maxx=b;
return ;
}
int mid=(t[x].l+t[x].r)/2;
if(a<=mid) change(x*2,a,b);
else change(x*2+1,a,b);
updown(x);
}
int ask(int x,int a,int b)
{
if(t[x].l>=a&&t[x].r<=b)
{
return t[x].maxx;
}
int mid=(t[x].l+t[x].r)/2;
int maxx=-1e9;
if(a<=mid) maxx=max(maxx,ask(x*2,a,b));
if(b>mid) maxx=max(maxx,ask(x*2+1,a,b));
return maxx;
}
int query(int u,int v)
{
int ans=-1e9;
while(top[u]!=top[v])
{
if(depth[top[u]]<depth[top[v]])
{
swap(u,v);
}
ans=max(ans,ask(1,in[top[u]],in[u]));
u=f[top[u]];//f
}
if(u==v) return ans;
if(depth[u]<depth[v])
{
swap(u,v);
}
ans=max(ans,ask(1,in[v]+1,in[u]));//权值在边上
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
memset(h,-1,sizeof h);
idx=0;c=0;
for(int i=1;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c,i);add(b,a,c,i);
}
dfs1(1,-1,1);
dfs2(1,-1,1);
char s[10];
build(1,1,n);
while(scanf("%s",s)!=EOF&&s[0]!='D')
{
int a,b;
scanf("%d%d",&a,&b);
if(s[0]=='C')
{
change(1,in[cnt[a]],b);//是in不是ord
}
else
{
printf("%d\n",query(a,b));
}
}
}
}
QTREE - Query on a tree(树链剖分)
最新推荐文章于 2022-07-22 21:44:52 发布