rt,萌新不会 c 语言,求助!!玄五关。
#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=1e5+10,maxm=1e6+10,mod=998244353;
int T,n,idtt,eu[maxn],ev[maxn],ew[maxn],dep[maxn],sz[maxn],fa[maxn];
int hs[maxn],lt[maxn],id[maxn],tmp[maxn],val[maxn],mx[maxn<<2];
vector<pii> e[maxn];
void dfs1(int u){
sz[u]=1;
for(auto &[v,w]:e[u]) if(v!=fa[u]){
fa[v]=u,val[v]=w,dep[v]=dep[u]+1,dfs1(v),sz[u]+=sz[v];
if(sz[v]>sz[hs[u]]) hs[u]=v;
}
}
void dfs2(int u){
if(!lt[u]) lt[u]=u;
lt[hs[u]]=lt[u],tmp[id[u]=++idtt]=val[u];
if(hs[u]) dfs2(hs[u]);
for(auto &[v,w]:e[u]) if(v!=fa[u]&&v!=hs[u]) dfs2(v);
}
inline void pushup(int id){mx[id]=max(mx[id<<1],mx[id<<1|1]);}
void build(int id,int l,int r,int *tmp){
if(l==r){
mx[id]=tmp[l];
return;
}
int mid=l+r>>1;
build(id<<1,l,mid,tmp),build(id<<1|1,mid+1,r,tmp),pushup(id);
}
void change(int id,int l,int r,int k,int x){
if(l==r){
mx[id]=x;
return;
}
int mid=l+r>>1;
if(k<=mid) change(id<<1,l,mid,k,x);
else change(id<<1|1,mid+1,r,k,x);
pushup(id);
}
int query(int id,int l,int r,int lq,int rq){
if(lq<=l&&r<=rq) return mx[id];
int mid=l+r>>1,ans=0;
if(lq<=mid) ans=max(ans,query(id<<1,l,mid,lq,rq));
if(rq>mid) ans=max(ans,query(id<<1|1,mid+1,r,lq,rq));
return ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>T;
while(T--){
cin>>n,idtt=0;
rep(i,1,n-1){
cin>>eu[i]>>ev[i]>>ew[i];
e[eu[i]].push_back({ev[i],ew[i]}),e[ev[i]].push_back({eu[i],ew[i]});
}
dfs1(1),dfs2(1),build(1,1,n,tmp);
rep(o,1,3e5){
int u,v,k,w,ans=0;
string opt;
cin>>opt;
if(opt=="DONE") break;
if(opt=="CHANGE"){
cin>>k>>w;
if(dep[eu[k]]<dep[ev[k]]) swap(eu[k],ev[k]);
change(1,1,n,id[eu[k]],w);
continue;
}
cin>>u>>v;
for(;lt[u]!=lt[v];u=fa[lt[u]]){
if(dep[lt[u]]<dep[lt[v]]) swap(u,v);
ans=max(ans,query(1,1,n,id[lt[u]],id[u]));
}
if(id[u]>id[v]) swap(u,v);
if(u!=v) ans=max(ans,query(1,1,n,id[u]+1,id[v]));
cout<<ans<<'\n';
}
rep(i,1,n) e[i].clear();
#define cl(x) memset(x,0,sizeof x)
cl(eu),cl(ev),cl(ew),cl(dep),cl(sz),cl(fa),cl(hs),cl(lt),cl(id),cl(tmp),cl(val),cl(mx);
}
return 0;
}