代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<windows.h>
using namespace std;
const long long maxn=100005;
long long read()
{
long long s=0,w=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') w=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
s=(s<<3)+(s<<1)+(c^48);
c=getchar();
}
return s*w;
}
long long n,m;
struct edge{
long long to,w;
};
vector<edge> e[maxn];
//vector<pair<long long,long long> > edges;
void addedge(long long u,long long v,long long w)
{
e[u].push_back(edge{v,w});
e[v].push_back(edge{u,w});
}
long long val[maxn],dep[maxn],fa[maxn],sz[maxn],son[maxn];
long long seg[maxn],tot,top[maxn],rev[maxn*4];
long long eu[maxn],ev[maxn];
void dfs1(long long u,long long f,long long wlast)
{
dep[u]=dep[f]+1;
val[u]=wlast;
fa[u]=f;
sz[u]=1;
long long mx=0;
for(long long i=0;i<e[u].size();i++)
{
long long v=e[u][i].to,w=e[u][i].w;
if(v==f) continue;
dfs1(v,u,w);
sz[u]+=sz[v];
if(sz[v]>mx)
{
mx=sz[v];
son[u]=v;
}
}
}
void dfs2(long long u)
{
if(son[u])
{
seg[son[u]]=++tot;
rev[tot]=son[u];
top[son[u]]=top[u];
dfs2(son[u]);
for(long long i=0;i<e[u].size();i++)
{
long long v=e[u][i].to;
if(v!=fa[u] && v!=son[u])
{
seg[v]=++tot;
rev[tot]=v;
top[v]=v;
dfs2(v);
}
}
}
}
struct segtree{
long long l,r,dat,add,chg=-1;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define dat(x) tree[x].dat
#define add(x) tree[x].add
#define chg(x) tree[x].chg
};
segtree tree[maxn*4];
void build(long long p,long long l,long long r)
{
l(p)=l;
r(p)=r;
if(l==r)
{
dat(p)=val[rev[l]];
return;
}
long long mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
dat(p)=max(dat(p<<1),dat(p<<1|1));
}
void spread(long long p)
{
if(chg(p)!=-1)
{
dat(p<<1)=dat(p<<1|1)=chg(p<<1)=chg(p<<1|1)=chg(p);
add(p)=0;
chg(p)=-1;
}
if(add(p))
{
dat(p<<1)+=add(p);
dat(p<<1|1)+=add(p);
add(p<<1)+=add(p);
add(p<<1|1)+=add(p);
add(p)=0;
}
}
void change(long long p,long long l,long long r,long long c)
{
if(l>r) swap(l,r);
spread(p);
if(l<=l(p) && r>=r(p))
{
dat(p)=chg(p)=c;
return;
}
long long mid=(l(p)+r(p))>>1;
if(l<=mid) change(p<<1,l,r,c);
if(r>mid) change(p<<1|1,l,r,c);
dat(p)=max(dat(p<<1),dat(p<<1|1));
}
void update(long long p,long long l,long long r,long long c)
{
if(l>r) swap(l,r);
spread(p);
if(l<=l(p) && r>=r(p))
{
add(p)+=c;
dat(p)+=c;
return;
}
long long mid=(l(p)+r(p))>>1;
if(l<=mid) update(p<<1,l,r,c);
if(r>mid) update(p<<1|1,l,r,c);
dat(p)=max(dat(p<<1),dat(p<<1|1));
}
long long ask(long long p,long long l,long long r)
{
if(l>r) swap(l,r);
spread(p);
if(l<=l(p) && r>=r(p))
{
return dat(p);
}
long long ans=0;
long long mid=(l(p)+r(p))>>1;
if(l<=mid) ans=max(ans,ask(p<<1,l,r));
if(r>mid) ans=max(ans,ask(p<<1|1,l,r));
return ans;
}
long long query(long long u,long long v)
{
long long ans=0;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=max(ans,ask(1,seg[top[u]],seg[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans=max(ans,ask(1,seg[u]+1,seg[v]));
return ans;
}
void crange(long long u,long long v,long long c)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
change(1,seg[top[u]],seg[u],c);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
change(1,seg[u]+1,seg[v],c);
}
void urange(long long u,long long v,long long c)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
update(1,seg[top[u]],seg[u],c);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
update(1,seg[u]+1,seg[v],c);
}
string str;
long long x,y,z;
int main()
{
n=read();
for(long long i=1,u,v,w;i<n;i++)
{
u=read(),v=read(),w=read();
addedge(u,v,w);
eu[i]=u,ev[i]=v;
//edges.push_back(make_pair(u,v));
}
dfs1(1,0,0);
tot=seg[1]=rev[1]=top[1]=1;
dfs2(1);
build(1,1,n);
while(1)
{
cin>>str;
if(str=="Stop") break;
else if(str=="Max")
{
x=read(),y=read();
cout<<query(x,y)<<endl;
}
else if(str=="Change")
{
x=read(),z=read();
//crange(edges[x].first,edges[x].second,z);
if(dep[eu[x]]>dep[ev[x]]) change(1,seg[eu[x]],seg[eu[x]],z);
else change(1,seg[ev[x]],seg[ev[x]],z);
}
else if(str=="Cover")
{
x=read(),y=read(),z=read();
crange(x,y,z);
}
else if(str=="Add")
{
x=read(),y=read(),z=read();
urange(x,y,z);
}
}
}