只能过最后一个测试点10分,求大佬帮调Orz
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,u,v,w,cnt,id[100010],val[100010],fa[100010],top[100010],deep[100010],idl[100010],rk[100100],bigson[100010],size[100010];
string s;
struct node{
int to,nxt,val;
}edge[200010];
int head[100010],tot;
void add(int u,int v,int w){
edge[++tot].to=v;
edge[tot].nxt=head[u];
edge[tot].val=w;
head[u]=tot;
}
void dfs1(int x,int father,int lastval,int edgeid){
size[x]=1;
deep[x]=deep[father]+1;
fa[x]=father;
val[x]=lastval;
id[edgeid]=x;
int maxx=0;
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(y!=father){
dfs1(y,x,edge[i].val,(i+1)/2);
size[x]+=size[y];
if(size[y]>maxx){
maxx=size[y];
bigson[x]=y;
}
}
}
}
void dfs2(int x,int bigfa){
idl[x]=++cnt;
rk[cnt]=x;
top[x]=bigfa;
if(bigson[x]==0)
return ;
dfs2(bigson[x],bigfa);
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(y!=bigson[x]&&y!=fa[x])
dfs2(y,y);
}
}
struct tree{
int l,r,val,cover,add;
}mp[400010];
void pushup(int op){
if(mp[op].cover){
mp[op<<1].cover=mp[op<<1].val=mp[op<<1|1].cover=mp[op<<1|1].val=mp[op].cover;
mp[op<<1].add=mp[op<<1|1].add=mp[op].cover=0;
}
if(mp[op].add){
mp[op<<1].add+=mp[op].add;
mp[op<<1].val+=mp[op].add;
mp[op<<1|1].add+=mp[op].add;
mp[op<<1|1].val+=mp[op].add;
mp[op].add=0;
}
}
void build(int op,int l,int r){
mp[op].l=l,mp[op].r=r;
if(l==r){
mp[op].val=val[rk[l]];
return ;
}
int mid=mp[op].l+mp[op].r>>1;
build(op<<1,l,mid);
build(op<<1|1,mid+1,r);
mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
void change(int op,int x,int val){
if(mp[op].l==mp[op].r){
mp[op].val=val;
mp[op].add=mp[op].cover=0;
return ;
}
pushup(op);
int mid=mp[op].l+mp[op].r>>1;
if(x<=mid)
change(op<<1,x,val);
else change(op<<1|1,x,val);
mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
void cover(int op,int l,int r,int val){
if(l<=mp[op].l&&mp[op].r<=r){
mp[op].val=mp[op].cover=val;
mp[op].add=0;
return ;
}
pushup(op);
int mid=mp[op].l+mp[op].r>>1;
if(l<=mid)
cover(op<<1,l,r,val);
if(r>mid)
cover(op<<1|1,l,r,val);
mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
void upadd(int op,int l,int r,int val){
if(l<=mp[op].l&&mp[op].r<=r){
mp[op].val+=val;
mp[op].add+=val;
return ;
}
pushup(op);
int mid=mp[op].l+mp[op].r>>1;
if(l<=mid)
upadd(op<<1,l,r,val);
if(r>mid)
upadd(op<<1|1,l,r,val);
mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
int ask(int op,int l,int r){
if(mp[op].l>=l&&mp[op].r<=r)
return mp[op].val;
pushup(op);
int mid=mp[op].l+mp[op].r>>1,ans=0;
if(l<=mid)
ans=max(ask(op<<1,l,r),ans);
if(r>mid)
ans=max(ask(op<<1|1,l,r),ans);
mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
return ans;
}
int calc_ask(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(deep[x]<deep[y])
swap(x,y);
ans=max(ans,ask(1,idl[top[x]],idl[x]));
x=fa[top[x]];
}
if(deep[x]<deep[y])
swap(x,y);
if(x==y)
return ans;
ans=max(ans,ask(1,idl[y]+1,idl[x]));
return ans;
}
void calc_cover(int x,int y,int w){
while(top[x]!=top[y]){
if(deep[x]<deep[y])
swap(x,y);
cover(1,idl[top[x]],idl[x],w);
x=fa[top[x]];
}
if(deep[x]<deep[y])
swap(x,y);
if(x==y)
return ;
else cover(1,idl[y]+1,idl[x],w);
}
void calc_add(int x,int y,int w){
while(top[x]!=top[y]){
if(deep[x]<deep[y])
swap(x,y);
upadd(1,idl[top[x]],idl[x],w);
x=fa[top[x]];
}
if(deep[x]<deep[y])
swap(x,y);
if(x==y)
return ;
else upadd(1,idl[y]+1,idl[x],w);
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<n;i++){
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dfs1(1,1,0,0);
dfs2(1,1);
build(1,1,n);
while(1){
cin>>s;
if(s[0]=='S')
return 0;
else if(s[0]=='M'){
scanf("%lld%lld",&u,&v);
cout<<calc_ask(u,v)<<"\n";
}
else if(s[0]=='A'){
scanf("%lld%lld%lld",&u,&v,&w);
calc_add(u,v,w);
}
else if(s[0]=='C'&&s[1]=='o'){
scanf("%lld%lld%lld",&u,&v,&w);
calc_cover(u,v,w);
}
else{
scanf("%lld%lld",&u,&w);
change(1,idl[id[u]],w);
}
}
return 0;
}