RT,感觉很没有问题,但是却有很大问题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define eps 1e-8
const int inf=0x3f3f3f3f;
const int Maxn=1e5+10;
int siz[Maxn],son[Maxn],dep[Maxn],fat[Maxn];
int dfsTime;
int dfn[Maxn],Top[Maxn];
int head[Maxn],tot;
struct Edge{
int to;
int nxt;
}E[Maxn<<1];
void addedge(int u,int v)
{
tot++;
E[tot].to=v;
E[tot].nxt=head[u];
head[u]=tot;
}
void dfs1(int u,int fa)
{
dep[u]=dep[fa]+1;
fat[u]=fa;
siz[u]=1;
for(int i=head[u];i;i=E[i].nxt)
{
int v=E[i].to;
if(v==fa) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]])
{
son[u]=v;
}
}
}
int Ar[Maxn];
void dfs2(int u,int tp)
{
Top[u]=tp;
dfn[u]=++dfsTime;
if(!son[u])
{
return ;
}
dfs2(son[u],tp);
for(int i=head[u];i;i=E[i].nxt)
{
int v=E[i].to;
if(v==fat[u] || v==son[u]) continue;
dfs2(v,v);
}
}
struct segtree{
int maxx;
int tag1; // 加法tag
int tag2; // 赋值tag
}t[Maxn<<2];
#define ls node<<1
#define rs node<<1|1
void pushup(int node)
{
t[node].maxx=max(t[ls].maxx,t[rs].maxx);
}
void pushdown(int node)
{
if(t[node].tag2>=0)
{
t[ls].maxx=t[node].tag2;
t[rs].maxx=t[node].tag2;
t[ls].tag2=t[node].tag2;
t[rs].tag2=t[node].tag2;
t[ls].tag1=0;
t[rs].tag1=0;
t[node].tag2=-1;
}
if(t[node].tag1)
{
t[ls].maxx+=t[node].tag1;
t[rs].maxx+=t[node].tag1;
t[ls].tag1+=t[node].tag1;
t[rs].tag1+=t[node].tag1;
t[node].tag1=0;
}
}
void build(int node,int l,int r)
{
t[node].tag2=-1;
if(l==r)
{
t[node].maxx=Ar[l];
// cout<<"seg:"<<node<<":"<<Ar[l]<<endl;
t[node].tag2=-1;
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(node);
}
void modify(int node,int l,int r,int ql,int qr,int val) // 区间赋值
{
if(ql<=l && r<=qr)
{
t[node].maxx=val;
t[node].tag2=val;
t[node].tag1=0;
return ;
}
pushdown(node);
int mid=(l+r)>>1;
if(ql<=mid)
{
modify(ls,l,mid,ql,qr,val);
}
if(qr>mid)
{
modify(rs,mid+1,r,ql,qr,val);
}
pushup(node);
}
void update(int node,int l,int r,int ql,int qr,int val) // 区间加
{
if(ql<=l && r<=qr)
{
t[node].maxx+=val;
t[node].tag1+=val;
return ;
}
pushdown(node);
int mid=(l+r)>>1;
if(ql<=mid)
{
update(ls,l,mid,ql,qr,val);
}
if(qr>mid)
{
update(rs,mid+1,r,ql,qr,val);
}
pushup(node);
}
int query(int node,int l,int r,int ql,int qr)
{
// cout<<node<<" "<<l<<" "<r<<" "<<ql<<" "<<qr<<":";
if(ql<=l && r<=qr)
{
// cout<<t[node].maxx<<endl;
return t[node].maxx;
}
pushdown(node);
int maxx=-0x3f;
int mid=(l+r)>>1;
if(ql<=mid)
{
maxx=max(maxx,query(ls,l,mid,ql,qr));
}
if(qr>mid)
{
maxx=max(maxx,query(rs,mid+1,r,ql,qr));
}
return maxx;
}
int n;
struct Edges{
int u,v,w;
};
vector<Edges> ev;
void cover(int u,int v,int w)
{
while(Top[u]!=Top[v])
{
if(dep[Top[u]]<dep[Top[v]])
{
swap(u,v);
}
modify(1,1,n,dfn[Top[u]],dfn[u],w);
u=fat[Top[u]];
}
if(dfn[u]>dfn[v])
{
swap(u,v);
}
if(dfn[u]+1!=dfn[v])
{
modify(1,1,n,dfn[u]+1,dfn[v],w);
}
}
void add(int u,int v,int w)
{
while(Top[u]!=Top[v])
{
if(dep[Top[u]]<dep[Top[v]])
{
swap(u,v);
}
update(1,1,n,dfn[Top[u]],dfn[u],w);
u=fat[Top[u]];
}
if(dfn[u]>dfn[v])
{
swap(u,v);
}
if(dfn[u]+1!=dfn[v])
{
update(1,1,n,dfn[u],dfn[v],w);
}
}
int Max(int u,int v)
{
int ans=-0x3f;
while(Top[u]!=Top[v])
{
if(dep[Top[u]]<dep[Top[v]])
{
swap(u,v);
}
// cout<<u<<" "<<v<<endl;
// cout<<dfn[Top[u]]<<" "<<dfn[u]<<endl;
ans=max(ans,query(1,1,n,dfn[Top[u]],dfn[u]));
u=fat[Top[u]];
}
if(dfn[u]>dfn[v])
{
swap(u,v);
}
if(dfn[u]+1!=dfn[v])
{
ans=max(ans,query(1,1,n,dfn[u]+1,dfn[v]));
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
ev.push_back((Edges){u,v,w});
addedge(u,v);
addedge(v,u);
}
dfs1(1,0);
dfs2(1,1);
for(int i=0;i<n-1;i++)
{
int u=ev[i].u,v=ev[i].v,w=ev[i].w;
if(dep[u]<dep[v])
{
swap(u,v);
}
Ar[dfn[u]]=w;
// cout<<dfn[u]<<":"<<w<<endl;
}
build(1,1,n);
while(1)
{
string str;
cin>>str;
if(str=="Stop") return 0;
if(str=="Change")
{
int k,x;
scanf("%d%d",&k,&x);
int u=ev[k-1].u,v=ev[k-1].v;
if(dep[u]<dep[v])
{
swap(u,v);
}
modify(1,1,n,dfn[u],dfn[u],x);
}else if(str=="Cover"){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
cover(u,v,w);
}else if(str=="Add"){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}else{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",Max(u,v));
}
}
return 0;
}