https://vjudge.net/contest/54065#problem/A
**题意:给定一棵树,告诉了每条边的权值,然后给出两种操作:
(1)把第i条边的权值改为val
(2)询问a,b路径上权值最大的边**
当做模板,可是TLE了,可能时代久远,现在不能这样的3s多了。。
可以参考http://blog.csdn.net/ACdreamers/article/details/10639685
int is[N];
int fst[N],nxt[M],to[M],cost[M],e,val[N],w[N];
int fa[N],dep[N],sz[N],son[N];
int tid[N],top[N];
bool vis[N];
int label,n;
void init(){
mem(fst,-1);
e=0;
}
void add(int u,int v,int c){
to[e]=v,nxt[e]=fst[u];cost[e]=c;fst[u]=e++;
}
void dfs(int u,int p){
fa[u]=p;
sz[u]=1;
for(int i=fst[u];~i;i=nxt[i]){
int v=to[i],c=cost[i];
if(v==p)continue;
is[i>>1]=v;
dep[v]=dep[u]+1;
val[v]=c;
dfs(v,u);
sz[u]+=sz[v];
if(sz[son[u]]<sz[v]){
son[u]=v;
}
}
}
void dfs2(int u,int t){
vis[u]=1;
top[u]=t;
tid[u]=++label;
w[label]=val[u];
if(son[u])dfs2(son[u],t);
for(int i=fst[u];~i;i=nxt[i]){
int v=to[i];
if(!vis[v])dfs(v,v);
}
}
void cut(){
dep[1]=sz[0]=0;
mem(son,0);
dfs(1,-1);
mem(vis,0);
label=0;
dfs2(1,1);
}
int mx[N<<2];
void build(int ll,int rr,int i){
if(ll==rr){
mx[i]=w[ll];return;
}
build(ll,md,ls),build(md+1,rr,rs);
mx[i]=max(mx[ls],mx[rs]);
}
void update(int x,int v,int ll,int rr,int i){
if(ll==rr){
mx[i]=v;return ;
}
if(x<=md)update(x,v,ll,md,ls);
else update(x,v,md+1,rr,rs);
mx[i]=max(mx[ls],mx[rs]);
}
int query(int l,int r,int ll,int rr,int i){
if(ll==l&&rr==r)return mx[i];
if(r<=md)
return query(l,r,ll,md,ls);
if(l>md)
return query(l,r,md+1,rr,rs);
return max(query(l,md,ll,md,ls),query(md+1,r,md+1,rr,rs));
}
int calc(int x,int y){
int ret=-inf;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])swap(x,y);
ret=max(ret,query(tid[top[y]],tid[y],1,n,1));
y=fa[top[y]];
}
if(x!=y){
if(dep[x]>dep[y])swap(x,y);
ret=max(ret,query(tid[x]+1,tid[y],1,n,1));
}
return ret;
}
int main(){
int cas;
sf("%d",&cas);
while(cas--){
sf("%d",&n);
init();
for(int i=1;i<=n-1;++i){
int u,v,c;sf("%d%d%d",&u,&v,&c);
add(u,v,c);add(v,u,c);
}
cut();
build(1,n,1);
while(1){
char s[10];sf("%s",s);
if(s[0]=='Q'){
int u,v;sf("%d%d",&u,&v);
pf("%d\n",calc(u,v));
}
else if(s[0]=='C'){
int a,b;sf("%d%d",&a,&b);
update(tid[is[a-1]],b,1,n,1);
}
else break;
}
}
}