RT,求助(线段树略显毒瘤
#include<iostream>
#include<cstring>
#include<cstdio>
#define Maxn 100005
#define ls p<<1
#define rs p<<1|1
using namespace std;
struct edge{int nxt,t,val;}e[Maxn<<1];
struct node{int l,r,lazyS,lazyC,Max;}t[Maxn<<2];
int head[Maxn],n,m,a[Maxn],dep[Maxn],son[Maxn],size[Maxn],fa[Maxn];
int id[Maxn],rk[Maxn],top[Maxn],num=0,ef[Maxn],et[Maxn],temp[Maxn];
char S[100];
void read()
{
char ch=getchar();int x=0;
while((ch<'a'||ch>'z')&&(ch<'A'||ch>'Z')) ch=getchar();
while((ch<='z'&&ch>='a')&&(ch<='Z'&&ch>='A')){S[x]=ch;x++;ch=getchar();}
}
void add_edge(int f,int t,int v)
{
e[++num].nxt=head[f];
e[num].t=t,e[num].val=v;
head[f]=num;
}
void dfs1(int x,int d)
{
dep[x]=d,size[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].t;
if(v==fa[x]) continue;
temp[v]=e[i].val;
fa[v]=x;dfs1(v,d+1);
size[x]+=size[v];
if(size[v]>size[son[x]]) son[x]=v;
}
}
void dfs2(int x,int tp)
{
id[++num]=x,rk[x]=num;top[x]=tp;
if(!son[x])return;
else dfs2(son[x],tp);
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].t;
if(v==fa[x]||v==son[x]) continue;
dfs2(v,v);
}
}
void push_down(int p)
{
int s=t[p].lazyS,c=t[p].lazyC;
t[p].lazyS=0,t[p].lazyC=-1;
if(s==0&&c==-1) return;
if(c!=-1)
{
t[ls].lazyC=c,t[rs].lazyC=c;
t[ls].lazyS=0,t[rs].lazyS=0;
t[ls].Max=c;t[rs].Max=c;
}
t[ls].lazyS+=s;t[rs].lazyS+=s;
t[ls].Max+=s;t[rs].Max+=s;
}
void ModifyC(int l,int r,int p,int w)
{
if(t[p].l==l&&t[p].r==r)
{
t[p].lazyC=w;t[p].lazyS=0;t[p].Max=w;
return ;
}
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(l>mid) ModifyC(l,r,rs,w);
else if(r<=mid) ModifyC(l,r,ls,w);
else ModifyC(l,mid,ls,w),ModifyC(mid+1,r,rs,w);
t[p].Max=max(t[ls].Max,t[rs].Max);
}
void ModifyS(int l,int r,int p,int k)
{
if(t[p].l==l&&t[p].r==r)
{
t[p].lazyS+=k;t[p].Max+=k;
return;
}
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(r<=mid) ModifyS(l,r,ls,k);
else if(l>mid) ModifyS(l,r,rs,k);
else ModifyS(l,mid,ls,k),ModifyS(mid+1,r,rs,k);
t[p].Max=max(t[ls].Max,t[rs].Max);
}
void built(int l,int r,int p)//
{
t[p].l=l,t[p].r=r;
if(l==r){t[p].Max=a[l];return;}
int mid=(l+r)>>1;t[p].lazyC=-1;
built(l,mid,ls),built(mid+1,r,rs);
t[p].Max=max(t[ls].Max,t[rs].Max);
}
int query(int l,int r,int p)//
{
if(t[p].l==l&&t[p].r==r) return t[p].Max;
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(r<=mid) return query(l,r,ls);
else if(l>mid) return query(l,r,rs);
else return max(query(l,mid,ls),query(mid+1,r,rs));
}
void ModifySOnTree(int x,int y,int k)
{
while(top[x]!=top[y])
{
if(dep[x]<dep[y]) swap(x,y);
ModifyS(rk[top[x]],rk[x],1,k);x=fa[top[x]];
}
if(dep[x]<dep[y]) swap(x,y);
if(x==y) return;
ModifyS(rk[y]+1,rk[x],1,k);
}
void ModifyCOnTree(int x,int y,int k)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ModifyC(rk[top[x]],rk[x],1,k);x=fa[top[x]];
}
if(dep[x]<dep[y]) swap(x,y);
if(x==y) return;
if(dep[x]>dep[y])ModifyC(rk[y]+1,rk[x],1,k);
}
int QueryOnTree(int x,int y)
{
int ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(query(rk[top[x]],rk[x],1),ans);x=fa[top[x]];
}
if(dep[x]<dep[y]) swap(x,y);
if(x==y) return ans;
if(dep[x]>dep[y])ans=max(query(rk[y]+1,rk[x],1),ans);return ans;
}
int main()
{
cin>>n;
for(int i=1;i<n;++i)
{
int f,t,v;cin>>f>>t>>v;
add_edge(f,t,v);add_edge(t,f,v);
ef[i]=f,et[i]=t;
}
int s=1;
num=0;fa[s]=s;
dfs1(s,1),dfs2(s,s);
for(int i=1;i<=n;++i) a[rk[i]]=temp[i];
built(1,n,1);cin>>S;
while(S[0]!='S')
{
if(S[0]=='M')
{
int x,y;cin>>x>>y;
cout<<QueryOnTree(x,y)<<"\n";
}
if(S[0]=='A')
{
int x,y,k;cin>>x>>y>>k;
ModifySOnTree(x,y,k);
}
if(S[0]=='C')
{
if(S[1]=='h')
{
int k,w;cin>>k>>w;
if(fa[et[k]]==ef[k])
ModifyC(rk[et[k]],rk[et[k]],1,w);
else
ModifyC(rk[ef[k]],rk[ef[k]],1,w);
}
else
{
int u,v,w;cin>>u>>v>>w;
ModifyCOnTree(u,v,w);
}
}
cin>>S;
}
return 0;
}