RT,用了其他网址的RMJ显示TLE,不用管C++的问题。
CODE:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<string>
#include<algorithm>
#include<functional>
#include<numeric>
#include<math.h>
#define int long long
using namespace std;
const int N=10010,inf=1e9;
int t,n,head[N],cnt,fa[N],sz[N],dfn[N],rnk[N],top[N],val[N],sum[N<<2],dep[N],son[N],tot;
struct edge
{
int u,v,w;
}b[N];
struct sb
{
int y,z,nxt;
}a[N<<1];
inline void init()
{
memset(head,0,sizeof(head));
memset(fa,0,sizeof(fa));
memset(sz,0,sizeof(sz));
memset(dfn,0,sizeof(dfn));
memset(rnk,0,sizeof(rnk));
memset(top,0,sizeof(top));
memset(sum,0,sizeof(sum));
memset(dep,0,sizeof(dep));
memset(son,0,sizeof(son));
cnt=0;
tot=0;
}
inline void add(register int u,register int v,register int w)
{
a[++cnt].nxt=head[u];
a[cnt].y=v;
a[cnt].z=w;
head[u]=cnt;
}
inline void dfs1(register int x,register int from)
{
fa[x]=from;
sz[x]=1;
dep[x]=dep[from]+1;
for(register int p=head[x];p;p=a[p].nxt)
{
register int v=a[p].y,w=a[p].z;
if(from!=v)
{
val[v]=w;
dfs1(v,x);
sz[x]+=sz[v];
if(sz[v]>=sz[son[x]])
{
son[x]=v;
}
}
}
}
inline void dfs2(register int x,register int from)
{
dfn[x]=++tot;
rnk[dfn[x]]=x;
if(son[from]!=x)
{
top[x]=x;
}
else
{
top[x]=top[from];
}
for(register int p=head[x];p;p=a[p].nxt)
{
if(a[p].y!=from)
{
dfs2(a[p].y,x);
}
}
}
inline void pushup(register int x)
{
sum[x]=max(sum[x<<1],sum[x<<1|1]);
}
inline void build(register int l,register int r,register int p)
{
if(l==r)
{
sum[p]=val[rnk[l]];
return;
}
register int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
pushup(mid);
}
inline void update(register int x,register int k,register int ll,register int rr,register int p)
{
if(ll>x||rr<x)
{
return;
}
else if(ll==x&&rr==x)
{
sum[p]=k;
return;
}
else
{
register int mid=(ll+rr)>>1;
update(x,k,ll,mid,p<<1);
update(x,k,mid+1,rr,p<<1|1);
pushup(mid);
}
}
inline int query(register int l,register int r,register int ll,register int rr,register int p)
{
if(ll>r||rr<l)
{
return -inf;
}
else if(ll>=l&&rr<=r)
{
return sum[p];
}
else
{
int mid=(ll+rr)>>1;
return max(query(l,r,ll,mid,p<<1),query(l,r,mid+1,rr,p<<1|1));
}
}
inline int lca(register int u,register int v)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
{
v=top[v];
}
else
{
u=top[u];
}
}
return dep[u]<dep[v]?u:v;
}
inline int ask(register int u,register int v)
{
register int res=-inf;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])
{
res=max(res,query(dfn[top[v]],dfn[v],1,n,1));
v=top[v];
}
else
{
res=max(res,query(dfn[top[u]],u,1,n,1));
u=top[u];
}
}
if(dep[u]>dep[v])
{
swap(u,v);
}
return max(res,query(dfn[u],dfn[v],1,n,1));
}
signed main()
{
std::ios::sync_with_stdio(false);std::cin.tie(0);
cin>>t;
while(t--)
{
init();
cin>>n;
for(register int i=1;i<n;i++)
{
cin>>b[i].u>>b[i].v>>b[i].w;
add(b[i].u,b[i].v,b[i].w);
add(b[i].v,b[i].u,b[i].w);
}
val[1]=-inf;
dfs1(1,0);
dfs2(1,0);
build(1,n,1);
string op;
while(cin>>op)
{
if(op=="DONE")
{
break;
}
else if(op=="CHANGE")
{
register int xh,w;
cin>>xh>>w;
register int u=b[xh].u,v=b[xh].v;
if(fa[u]!=v)
{
swap(u,v);
}
update(dfn[u],w,1,n,1);
val[u]=w;
}
else
{
register int u,v;
cin>>u>>v;
register int c=lca(u,v);
register int w=val[c];
update(dfn[c],-inf,1,n,1);
cout<<ask(u,v)<<endl;
update(dfn[c],w,1,n,1);
}
}
}
return 0;
}